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

本文关键字:文件 信息 获取 NTFS-MFT 参考 | 更新日期: 2023-09-27 18:12:46

在我的c#应用程序中,我已经有了一种检查文件系统的方法,但我想利用从主文件表(MFT)读取的优势,因为它要快得多。我明白:1)它是一个专有的规范,因此可以在不通知的情况下进行更改,2)只有在应用程序以管理权限运行时才能访问它。

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

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

当您潜伏在MFT中时,您可以采用两种直接的方法来打开文件-您可以使用该文件引用号调用OpenFileByID (Vista和更高版本),或者您可以通过遍历读取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用于查询硬链接,但它变得很难看。