【问题标题】:How do you read the 128-bit NTFS FILE_ID for a directory and/or file?您如何读取目录和/或文件的 128 位 NTFS FILE_ID?
【发布时间】:2010-08-14 05:34:52
【问题描述】:

所以 NTFS 使用 128 位 Guid 来识别文件和目录,您可以很容易地查看这些信息:

C:\Temp>C:\Windows\System32\fsutil.exe objectid 查询。 对象 ID:ab3ffba83c67df118130e0cb4e9d4076 出生卷 ID : ca38ec6abfe0ca4baa9b54a543fdd84f BirthObjectId ID:ab3ffba83c67df118130e0cb4e9d4076 域ID:000000000000000000000000000000000

所以这很明显,但是如何以编程方式检索这些信息?查看 OpenFileById(...) 的 WinApi,您应该能够获得此信息。人们会期望这将在“Win32 FileID API Library”中完成,但那里的方法 (GetFileInformationByHandleEx) 返回一个FILE_ID_BOTH_DIR_INFO 结构。这个结构定义了一个 FileId;但是,它是一个 LARGE_INTEGER(64 位)而不是完整的 128 位标识符。

我猜有人可以为此使用 WMI,这是我应该转向的地方吗?

【问题讨论】:

    标签: c# c++ filesystems ntfs


    【解决方案1】:

    经过一番搜索,我找到了DeviceIoControl,这就是您问题的答案:FSCTL_GET_OBJECT_ID 返回的 ID 与您从 fsutil 的输出中返回的 ID 完全相同。

    无论如何,BY_HANDLE_FILE_INFORMATION 的文档说 64 位文件 ID 已经唯一标识给定卷上的文件。根据Wikipedia 的说法,NTFS 最多只支持 2^32 个文件,所以 128 位的 ID 似乎完全没有必要。

    【讨论】:

    • 完美! (不敢相信我没有找到)Ack - 同意 128 位 id 是矫枉过正...
    • 但请注意,Windows Server 2012 引入的 ReFS 文件系统使用 128 位文件标识符,并且不能保证您在此处获得的对象 ID 在此类卷上不再是唯一的!
    【解决方案2】:

    另外请注意,并非每个文件都有 GUID。 GUID 机制主要用于 .lnk 文件,以便在移动 traget 时保持关联。只有 $Volume 和链接文件的目标具有这些 GUID。此外,您可以手动设置它们。

    它们的优点是 GUID 不应该在卷之间发生冲突,而文件 ID 会发生冲突。 FILE_ID 实际上是 MFT_RECORD_NUMBER 的 48 位和 MFT_SEQUENCE_ID 的 16 位

    【讨论】:

    • 是的,我发现很难,必须改用 FSCTL_CREATE_OR_GET_OBJECT_ID (这需要 SeBackup 进程令牌)。 64 位的问题与 MS 创建它的原因相同。即使在卷或机器之间,我也需要跟踪文件的移动。
    猜你喜欢
    • 2023-03-03
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-09-10
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多