Как получить идентификатор файла

Получение файлового идентификатора в 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


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.