Получение файлового идентификатора в Windows
Две простые функции, позволяющие выяснить идентификатор файла, для последующего использования этого идентификатора с функцией OpenFileById, которая позволяет получить хэндл файла, не зная его имени (а зная лишь file id).
Первая функция, GetFileId(), позволяет получить обычный идентификатор. Вторая функция, GetFileIdEx(), позволяет получить 128-битный идентификатор файла, который поддерживается только в файловой системе ReFS под Windows Server 2012.
// Получение файлового идентификатора по хэндлу LARGE_INTEGER GetFileId(IN HANDLE hFile) { LARGE_INTEGER uResult; PBY_HANDLE_FILE_INFORMATION bhfi; if (INVALID_HANDLE_VALUE == hFile) { ZeroMemory(&uResult, sizeof(LARGE_INTEGER)); return uResult; } bhfi = (PBY_HANDLE_FILE_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BY_HANDLE_FILE_INFORMATION)); GetFileInformationByHandle(hFile, bhfi); uResult.LowPart = bhfi->nFileIndexLow; uResult.HighPart = bhfi->nFileIndexHigh; HeapFree(GetProcessHeap(), 0, bhfi); return uResult; } //128-битный ИД BOOL GetFileIdEx(IN HANDLE hFile, PFILE_ID_INFO pFii) { BOOL bResult = FALSE; if ((NULL == pFii) || (INVALID_HANDLE_VALUE == hFile)) { return bResult; } OSVERSIONINFOEX osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*) &osvi); // Windows 2012 Server или выше if ( osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion >= 2 && osvi.wProductType != VER_NT_WORKSTATION) { bResult = GetFileInformationByHandleEx(hFile, FileIdInformation, pFii, sizeof(FILE_ID_INFO)); } return bResult; }
Автор: амдф
Дата: 22.12.2012
Разделы сайта
Избранное
Остальное
Лента atom
Избранное
Остальное
Лента atom
При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт. По поводу рекламы обращайтесь на почту [email protected]