如何从NTFS索引号获取文件路径?

时间:2010-06-22 08:04:23

标签: c++ winapi

我有从GetFileInformationByHandle调用获得的dwVolumeSerialNumber,nFileIndexHigh,nFileIndexLow值。如何从这些值中获取文件路径?

3 个答案:

答案 0 :(得分:4)

由于硬链接,可能有多个路径映射到给定的VolumeSerialNumber和FileIndex。要找到所有这些路径:

  1. 迭代卷以查找根目录与dwVolumeSerialNumber
  2. 匹配的卷
  3. 递归枚举卷上的所有目录,跳过符号链接和重新分析点,找到匹配nFileIndexHigh和nFileIndexLow的所有文件。
  4. 这可能非常耗时。如果你真的需要尽可能快地完成这个并且你的文件系统是NTFS,那么你可以将整个MFT读入缓冲区并自己解析它。这将使所有适合MFT条目的目录一举得到。其余目录可以通过操作系统读取,也可以通过原始读取读取,具体取决于您要执行的工作量。但无论你如何看待它,这都是很多的工作,甚至不适用于FAT,FAT32或任何其他文件系统。

    如果可能的话,更好的解决方案可能是挂在原始路径上。

答案 1 :(得分:4)

这个MSDN article显示了如何从文件句柄中获取路径。

您使用OpenFileById打开一个文件给定其文件ID,但您还需要在同一卷上的其他位置打开文件,我假设获取卷序列号。

This blog posting提出了一个有趣的问题,你需要传递24个结构大小(通过查看汇编代码来计算)。

我把它留作一个有趣的练习(我找不到一个简单的答案)你如何从dwVolumeSerialNumber转到为该卷或该卷上的文件打开一个有效的其他句柄,但也许你已经有足够的信息为你的情况。一种可能性是迭代所有挂载的卷,调用GetVolumeInformation以找到具有匹配序列号的卷。

注意:如果您没有打开文件,那么您可能无法依赖BY_HANDLE_FILE_INFORMATION Structure notes中所述的nFileIndexHigh / Low组合(也就是文件ID),它警告它可以更改为FAT系统,但在NTFS文件系统中,文件保留相同的文件ID,直到被删除。

答案 2 :(得分:1)

注意:原始问题中有错误。既然问题已得到解决,这个答案就不再适用了。


一般情况下你不能。您检索到的信息只会告诉您文件所在的磁盘以及文件的大小。它没有提供足够的信息来识别实际文件。具体做法是:

  • dwVolumeSerialNumber标识音量,
  • nFileSizeHigh和nFileSizeLow为您提供文件大小

如果文件恰好是该卷上唯一具有该大小的文件,则可以在卷中搜索该大小的文件。但总的来说这既昂贵又不可靠,所以我不推荐它。