如何使用 WinApi / USN / MasterFileTable 为所有磁盘中的所有文件设置唯一 ID?
How to have a unique ID for all files in all disks, using WinApi / USN / MasterFileTable?
我正在使用一些disk/partitions(C:、D:、E:、F: 等)的 NTFS MasterFileTable / USN 日志,并且我想为每个 file/directory.
使用唯一的 ID
当我阅读 USN_RECORD(也称为 PUSN_RECORD)时,有一个 int64:
DWORDLONG FileReferenceNumber;
这是一个唯一的 file/directory 标识符,至少在当前分区中是唯一的。
但可能会发生冲突:
- C: 中的文件可能有 FileReferenceNumber 1932847
- D: 中的另一个文件也可能具有 FileReferenceNumber 1932847!
我想避免必须使用像 int128
这样大的东西(那将是 FileReferenceNumber
的 64 位 + 驱动器盘符 C:、D: 的 5 位, E:, ..., Z:).
我也想避免使用一对 (char DriveLetter, DWORDLONG FileReferenceNumber)
来识别计算机中的文件。
如何用一个64位的int来编码FileReferenceNumber
+盘符?
可能是因为FileReferenceNumber
有一些空闲未使用的位?
如果没有,你会怎么处理?
您必须使用一对 FileReferenceNumber/FileID 和 "volume something"。你可以mount a volume in a folder所以你不能真正使用驱动器号。
理想情况下 "volume something" 是 volume GUID path,但如果大小很重要,您可以使用卷序列号。注意:并非所有卷都有 GUID。
对于 NTFS,您可以从 GetFileInformationByHandle
and build a 32-bit+64-bit pair. For ReFS you need GetFileInformationByHandleEx
获取它并构建一个 64 位 +128 位对。
我正在使用一些disk/partitions(C:、D:、E:、F: 等)的 NTFS MasterFileTable / USN 日志,并且我想为每个 file/directory.
使用唯一的 ID当我阅读 USN_RECORD(也称为 PUSN_RECORD)时,有一个 int64:
DWORDLONG FileReferenceNumber;
这是一个唯一的 file/directory 标识符,至少在当前分区中是唯一的。
但可能会发生冲突:
- C: 中的文件可能有 FileReferenceNumber 1932847
- D: 中的另一个文件也可能具有 FileReferenceNumber 1932847!
我想避免必须使用像 int128
这样大的东西(那将是 FileReferenceNumber
的 64 位 + 驱动器盘符 C:、D: 的 5 位, E:, ..., Z:).
我也想避免使用一对 (char DriveLetter, DWORDLONG FileReferenceNumber)
来识别计算机中的文件。
如何用一个64位的int来编码FileReferenceNumber
+盘符?
可能是因为FileReferenceNumber
有一些空闲未使用的位?
如果没有,你会怎么处理?
您必须使用一对 FileReferenceNumber/FileID 和 "volume something"。你可以mount a volume in a folder所以你不能真正使用驱动器号。
理想情况下 "volume something" 是 volume GUID path,但如果大小很重要,您可以使用卷序列号。注意:并非所有卷都有 GUID。
对于 NTFS,您可以从 GetFileInformationByHandle
and build a 32-bit+64-bit pair. For ReFS you need GetFileInformationByHandleEx
获取它并构建一个 64 位 +128 位对。