从NTFS-MFT参考编号获取文件信息

Cra*_*ver 5 .net c# fileinfo ntfs-mft

在我的C#应用​​程序中,我已经有办法检查文件系统,但我想利用从主文件表(MFT)读取,因为它更快.我理解1)它是专有规范,因此如有更改,恕不另行通知; 2)只有在应用程序在管理权限下运行时才能访问它.

我设法通过此代码读取主文件表.从MFT查询中,我得到一个文件名和一个所谓的文件引用号.我找不到的是如何转换到.NET FileInfo对象,甚至转换到Windows API文件句柄,以便我可以获得有关文件/文件夹的更多信息,例如:文件大小,完整路径,日期邮票等

Cla*_*lay 5

当您潜伏在 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 );
Run Code Online (Sandbox Code Playgroud)

一旦您拥有 SafeFileHandle(并且您已检查它是否有效),您就可以将其传递给 FileStream 构造函数并像平常一样读/写文件。

每个文件都在 MFT 中表示,但有一些注意事项。例如,单个文件可以位于文件层次结构中的多个位置,但所有文件都有一个 MFT 条目 - 这些是所谓的硬链接(它们不是副本 - 有多个入口点一个文件 - 令人头疼的事情比比皆是)。有数千个这样的。有一些 API 可以用来查询硬链接,但它变得很难看。