2010-08-14 26 views
4

所以NTFS使用128位的GUID來識別文件和目錄,你可以查看這些信息很容易就夠了:如何讀取目錄和/或文件的128位NTFS FILE_ID?

 
C:\Temp>C:\Windows\System32\fsutil.exe objectid query . 
Object ID :  ab3ffba83c67df118130e0cb4e9d4076 
BirthVolume ID : ca38ec6abfe0ca4baa9b54a543fdd84f 
BirthObjectId ID : ab3ffba83c67df118130e0cb4e9d4076 
Domain ID :  00000000000000000000000000000000 

因此,這是明顯不夠的,但一個人如何以編程方式檢索這些信息?看看WinApi的OpenFileById(...)你應該能夠得到這些信息。人們會認爲這是在「Win32 FileID API Library」中完成的,但該方法(GetFileInformationByHandleEx)返回FILE_ID_BOTH_DIR_INFO結構。這個結構定義了一個FileId;然而,它是一個LARGE_INTEGER(64位)而不是完整的128位標識符。

我在猜測一個人可以使用WMI來做這件事,那我應該轉向哪裏?

回答

6

有點搜索把我帶到DeviceIoControl,這就是你的問題的答案:FSCTL_GET_OBJECT_ID返回與你的輸出fsutil完全相同的ID。

無論如何,BY_HANDLE_FILE_INFORMATION的文檔說,64位文件ID已經唯一標識給定捲上的文件。根據Wikipedia,NTFS僅支持最多2^32個文件,因此128位ID似乎是不必要的。

+0

完美! (不敢相信我沒有找到)Ack - 同意128位id是過度殺毒... – 2010-08-14 17:52:11

+1

但要小心,隨Windows Server 2012引入的ReFS文件系統使用128位文件標識符和對象ID在這樣的捲上,你不能保證獨一無二! – Christoph 2014-02-10 09:17:02

1

也請不要說,不是每個文件都有一個GUID。 Th GUID mechanisim主要用於.lnk文件,以便在移動traget時保持關聯。只有$卷和鏈接文件的目標具有這些GUID。此外,您可以手動設置它們。

它們的優點是GUID不應該在卷之間衝突,而文件ID卻可以。 FILE_ID實際上是48位的MFT_RECORD_NUMBER和16位的MFT_SEQUENCE_ID

+0

是的,我發現硬的方法,不得不使用FSCTL_CREATE_OR_GET_OBJECT_ID(它需要SeBackup進程標記)。 64bit的問題與MS創建它的原因是一樣的。即使在卷或機器之間,我也需要跟蹤文件的移動。 – 2010-08-24 13:31:00

相關問題