Как получить уникальный идентификатор для всех файлов на всех дисках, используя 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-битную пару.