當你潛伏在MFT中時,有兩種簡單的方法可以打開文件 - 您可以用文件引用號(Vista和更高版本)致電OpenFileByID,或者您可以完全構建通過遍歷您在讀取MFT時創建的列表,然後使用組合名稱調用CreateFile來獲得合格的文件名。
你想從的CreateFile或OpenFileByID手柄成SafeFileHandle:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern SafeFileHandle CreateFile(string lpFileName, EFileAccess dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern SafeFileHandle OpenFileById(IntPtr volumeHandle, ref FileIdDescriptor lpFileId, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwFlagsAndAttributes);
一旦你的SafeFileHandle(和你已經檢查了它的有效的),你可以將它傳遞給一個FileStream構造函數和像正常一樣讀/寫文件。
每個文件都在MFT中表示,但有一些注意事項。例如,單個文件可以位於多個位置的文件層次結構中,但對於所有這些文件都有一個MFT條目 - 這些是所謂的硬鏈接(它們不是副本) - 有多個入口點一個文件 - 頭痛比比皆是)。有成千上萬種。有審訊硬鏈接的API,但它變得醜陋。
一旦您能夠轉換爲文件句柄或文件信息對象,您可能最終會完成框架或文件api的所有工作。結果可能沒有顯着的收益。除非您保持低水平,否則MFT可能無法證明是有益的,這會破壞託管代碼的用途。 – pushpraj
我不同意,但也許我之前並不清楚。用戶將輸入一些將用作文件規格的搜索文本。在整個驅動器卷中查詢MFT的部分匹配將比通過框架或API執行更快。一旦我有了這個名單,我會用較慢的方法來填補入圍項目的細節。這個例子已經在免費軟件程序[Everything](http://www.voidtools.com/)和[UltraSearch](http://www.jam-software.com/ultrasearch/)中實現。 –