我需要在我的.net应用程序中使用C#访问Windows MFT(主文件表).
我搜索了这个,但没有找到任何好结果.我一直在搜索过去2天的信息,但一直无法找到相同的信息.
我不是在寻找确切的代码来做同样的事情,我只是在寻找可以让我开始的一些信息.
我唯一能够弄清楚的是我必须使用P/Invoke.
我想知道我将用于访问MFT的功能.
如果您能够提供一些代码示例,那就太棒了.
继续我之前的问题,我能够使用这个delphi单元使用这个EnumMFTEntries()函数实现疯狂的FAST驱动器扫描,但是我无法完成以下任务:
change journal
以获取新修改的文件(更改,重命名,删除等...)在阅读了该函数以及 StCroixSkipper的USN Journal Explorer(在C#中)后,我修改了这个破坏的例程.EnumMFTEntries()
由于某种原因,报告的文件名始终为#0
function EnumUsnEntries(ARootHandle : Cardinal; AMFTEnumBuff : Pointer; EnumCallBack : TMFTEnumCallback) : Boolean;
var
P : Pointer;
UsnEnum : Pointer;
BytesRet : Cardinal;
PUSN : PUSNRecord;
ReadUSN : TReadUSNJournalData;
PReadUSN : PReadUSNJournalData;
UsnJournalData : TUSNJournalData;
BUF_SIZE : Integer;
begin
Result := False;
if (ARootHandle = INVALID_HANDLE_VALUE) OR (AMFTEnumBuff = nil) then
Exit;
QueryUSNJournal(ARootHandle, UsnJournalData);
with ReadUSN do
begin …
Run Code Online (Sandbox Code Playgroud) 我正在编写一些代码来解析 NTFS 卷中磁盘上的 MFT。这很简单,但一个特殊的角落案例引起了我的注意,我在互联网上的任何地方都找不到明确的答案。
对于 NTFS 中的普通文件,如果文件的属性多于单个记录的容量(例如,如果文件有很多硬链接,则有很多 $FILE_NAME 属性,或者很多$DATA 属性(如果它有许多备用数据流)。
参考编号为 0 的 $MFT 文件保存 MFT 本身的数据运行。通常它是一个没有孩子的单一记录。$MFT 文件是否有可能有子记录?如果可能的话,你怎么知道在哪里可以找到它们?这些子记录是否必须以非常低的参考号存储,以便您可以可靠地获取它们,而不必已经解析 $MFT 以知道它们在磁盘上的位置?
我正在尝试通过 MSDN 上的示例(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365736%28v=vs.85%29.aspx)了解如何在为了跟踪 NTFS 驱动器上的文件更改。示例代码运行良好。
但是,在此示例代码中,USN_RECORD 结构仅返回文件引用号和文件名。它不会返回文件的完整路径。有谁知道如何查询 USN 日志以返回完整路径?或者有没有办法从文件参考号中获取完整路径?
谢谢。
任何人都可以推荐一个MFT清理工具吗?我希望在我的MFT中恢复曾经存在但已被删除为"原始"状态的文件条目,并将条目清零.
我正在编写一个工具,可以找到适用于Mac和Windows的iTunes资料库的丢失文件.在Mac上,我可以通过使用精彩的"CatalogSearch"功能命名来快速查找文件.
但是,在Windows上,似乎没有用于按文件名搜索的OS API(或者是否存在?).
经过一些谷歌搜索,我了解到有一些工具(如TFind,Everything)直接读取NTFS目录并扫描它以按名称查找文件.
我想做同样的事情,但不必从头开始(虽然我过去写了很多磁盘工具,但我从来没有精力去挖掘NTFS).
我想知道是否有现成的库,可能是.dll,它会给我这个搜索功能:传入一个文件名,回到它的路径.
或者,Windows索引服务怎么样?至少当我在最近安装的XP Home系统上尝试此操作时," 开始"菜单下的" 搜索"操作实际上会扫描所有目录,这表明它没有完整的数据库.由于我根本不是Windows用户,我想知道为什么这不起作用.
最后,我需要的完整解决方案是:我有一个要查找的文件名列表,我需要搜索整个磁盘的代码(或者使用数据库)来一次性获取所有结果.例如,搜索不应该为我正在查找的每个文件启动新的完整扫描.这就是为什么我认为MFT方式是最优的,因为它可以快速迭代所有名称,将每个名称与我的列表进行比较.
对于我正在做的一些商业项目,我需要能够读取 $mft 文件中存储的实际数据。
我找到了一个可以提供帮助的gpl 库,但由于它是 gpl,我无法将其集成到我的代码中。
有人可以向我指出一个我可以使用的项目/或者向我指出相关的 Windows API(不需要 1000 行代码来实现的东西)
顺便说一句,为什么 Windows 不允许我直接读取 mft 文件?(通过创建文件和读取方法,如果我想毁掉我的驱动器,那是我的事而不是女士的事)。
谢谢。
在我的C#应用程序中,我已经有办法检查文件系统,但我想利用从主文件表(MFT)读取,因为它更快.我理解1)它是专有规范,因此如有更改,恕不另行通知; 2)只有在应用程序在管理权限下运行时才能访问它.
我设法通过此代码读取主文件表.从MFT查询中,我得到一个文件名和一个所谓的文件引用号.我找不到的是如何转换到.NET FileInfo对象,甚至转换到Windows API文件句柄,以便我可以获得有关文件/文件夹的更多信息,例如:文件大小,完整路径,日期邮票等
我通过查看 NTFS MFT / USN 日志来枚举 NTFS 硬盘驱动器分区的文件:
HANDLE hDrive = CreateFile(szVolumePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
DWORD cb = 0;
MFT_ENUM_DATA med = { 0 };
med.StartFileReferenceNumber = 0;
med.LowUsn = 0;
med.HighUsn = MAXLONGLONG; // no change in perf if I use med.HighUsn = ujd.NextUsn; where "USN_JOURNAL_DATA ujd" is loaded before
unsigned char pData[sizeof(DWORDLONG) + 0x10000] = { 0 }; // 64 kB
while (DeviceIoControl(hDrive, FSCTL_ENUM_USN_DATA, &med, sizeof(med), pData, sizeof(pData), &cb, NULL))
{
med.StartFileReferenceNumber = …
Run Code Online (Sandbox Code Playgroud) 我知道如何读取文件,将这些字节传递给哈希算法(例如 MD5SUM、SHA256 或 CRC32),并获取哈希值。
在这里我问的问题略有不同:
每次我们在 NTFS 分区上写入/修改文件时,它是否会重新计算哈希或 CRC32 并将此信息存储在 NTFS 元数据/FAT/MFT(主文件表)中(我不记得确切的名称)?
注意:重要的是我只想读取存储在文件系统中的存储哈希/CRC(即读取几个字节,最多应该是几毫秒),而不是重新计算哈希(这将花费很多秒来计算 10 GB 文件)。
如果是这样,如何使用 Python 访问特定文件的 CRC 或哈希值?有没有类似的东西:
import ntfsutil
ntfsutil.getCRC('d:/big50GBfile.dat') # done in < 10 ms
Run Code Online (Sandbox Code Playgroud) 我们知道,在NTFS中,我们将元数据存储在称为MFT记录(包含一些运行)的结构中.
这本书问下一个问题
可以是短文件使用的MFT记录多于较长的文件吗?
我认为答案是否定的 - 因为如果我们有一个文件,其元数据超过一个MFT的大小,那么我们必须使用运行.还有其他建议吗?