在我的C#应用程序中,我已经有办法检查文件系统,但我想利用主文件表(MFT)中的读取,因为它要快得多。我理解1)它是专有规范,因此如有更改,恕不另行通知; 2)只有在应用程序以管理权限运行时才能访问它。
我设法通过this code阅读主文件表。从MFT查询中,我得到一个文件名和一个所谓的文件引用号。我找不到的是如何转换到.NET FileInfo对象,甚至转换到Windows API文件句柄,以便我可以获得有关文件/文件夹的更多信息,例如:文件大小,完整路径,日期邮票等。
答案 0 :(得分:4)
当您潜伏在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,但它很难看。