Следующий код должен работать для файлов (включая жесткие ссылки) и каталогов (включая соединения), но оба пути должны быть действительными!
#include <windows.h>
#include <stdio.h>
BOOL ArePathsEqual(LPCTSTR path1,LPCTSTR path2)
{
BY_HANDLE_FILE_INFORMATION bhfi1,bhfi2;
HANDLE h1, h2 = NULL;
DWORD access = 0;
DWORD share = FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE;
h1 = CreateFile(path1,access,share,NULL,OPEN_EXISTING,(GetFileAttributes(path1)&FILE_ATTRIBUTE_DIRECTORY)?FILE_FLAG_BACKUP_SEMANTICS:0,NULL);
if (INVALID_HANDLE_VALUE != h1)
{
if (!GetFileInformationByHandle(h1,&bhfi1)) bhfi1.dwVolumeSerialNumber = 0;
h2 = CreateFile(path2,access,share,NULL,OPEN_EXISTING,(GetFileAttributes(path2)&FILE_ATTRIBUTE_DIRECTORY)?FILE_FLAG_BACKUP_SEMANTICS:0,NULL);
if (!GetFileInformationByHandle(h2,&bhfi2)) bhfi2.dwVolumeSerialNumber = bhfi1.dwVolumeSerialNumber + 1;
}
CloseHandle(h1);
CloseHandle(h2);
return INVALID_HANDLE_VALUE != h1 && INVALID_HANDLE_VALUE != h2
&& bhfi1.dwVolumeSerialNumber==bhfi2.dwVolumeSerialNumber
&& bhfi1.nFileIndexHigh==bhfi2.nFileIndexHigh
&& bhfi1.nFileIndexLow==bhfi2.nFileIndexLow ;
}
void main()
{
BOOL bRet = ArePathsEqual("c:\\program files","c:\\progra~1");
printf("ArePathsEqual: %d\n",bRet);
}