Как получить уникальный идентификатор для всех файлов на всех дисках, используя WinApi / USN / MasterFileTable?

Я использую журнал NTFS MasterFileTable / USN для нескольких дисков / разделов (C:, D:, E:, F: и т. Д.) И хочу использовать уникальный идентификатор для каждого файла / каталога.

Пока я читаю USN_RECORD (также называемый PUSN_RECORD), есть этот int64:

DWORDLONG     FileReferenceNumber;

это уникальный идентификатор файла / каталога, уникальный, по крайней мере, в текущем разделе.

Но могут быть столкновения:

  • файл в C: может иметь FileReferenceNumber 1932847
  • другой файл в D: тоже может иметь FileReferenceNumber 1932847!

Я хотел бы избежать использования такой большой вещи, как int128 (это будет 64 бита FileReferenceNumber + 5 бит для буквы диска C:, D:, E:, ..., Z:).

Я также хотел бы избежать использования пары (char DriveLetter, DWORDLONG FileReferenceNumber) идентифицировать файл на компьютере.

Как использовать 64-битный int для кода FileReferenceNumber + буква диска?

Это возможно, потому что FileReferenceNumber есть несколько свободных неиспользованных битов?

Если нет, как бы вы справились с этим?

1 ответ

Решение

Вы должны использовать пару FileReferenceNumber/FileID и "том-то". Вы можете смонтировать том в папке, чтобы не использовать букву диска.

В идеале "том-то" - это GUID-путь тома, но вы можете использовать серийный номер тома, если размер важен. Примечание. Не все тома имеют GUID.

Для NTFS вы можете получить его от GetFileInformationByHandle и построить 32-битную +64-битную пару. Для ReFS вам нужно GetFileInformationByHandleEx и построить 64-битную +128-битную пару.

Другие вопросы по тегам