c# - 从 NTFS-MFT 引用号获取文件信息

标签 c# .net fileinfo ntfs-mft

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

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

最佳答案

当您潜伏在 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 条目 - 这些是所谓的硬链接(hard link)(它们不是副本 - 有多个入口点一个文件 - 头痛比比皆是)。这些有成千上万。有用于查询硬链接(hard link)的 API,但它变得很丑陋。

关于c# - 从 NTFS-MFT 引用号获取文件信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724343/

相关文章:

c# - 使用 C# 解压缩 .gz 文件

c# - 如何使用 LINQ 更新列表中的值

c# - Windows XP 的 .NET 进程问题

.net - FileInfo.OpenText() 无法读取特殊字符üò°

php - FileInfo 在 php 5.3.3 中不起作用

c# - DirectoryInfo GetFiles TOP 编号

c# - MS "VCard"法国特价字符

javascript - 添加 MasterPage 时 ScriptManager.RegisterClientScriptBlock 不再工作

.net - 在 C# 中实现编译器最有趣和最有前途的方法是什么?

c# - mysql 函数的正确语法