5

我正在编写一个工具,用于查找 iTunes 库中丢失的文件,适用于 Mac 和 Windows。在 Mac 上,我可以使用奇妙的“目录搜索”功能通过命名快速找到文件。

但是,在 Windows 上,似乎没有用于按文件名搜索的 OS API(或者有吗?)。

经过一番谷歌搜索,我了解到有一些工具(如TFindEverything)可以直接读取 NTFS 目录并扫描它以按名称查找文件。

我也想这样做,但不必从头开始(虽然我过去写过不少磁盘工具,但我从来没有精力深入研究 NTFS)。

我想知道周围是否有现成的库,可能是.dll,这会给我这个搜索功能:传入文件名,取回它的路径。

或者,Windows 索引服务呢?至少当我在最近安装的 XP Home 系统上尝试此操作时,开始菜单下的搜索操作实际上会扫描所有目录,这表明它没有完整的数据库。由于我根本不是 Windows 用户,我想知道为什么这不起作用。

最后,我需要的完整解决方案是:我有一个要查找的文件名列表,并且我需要搜索整个磁盘(或使用数据库)的代码,以便一次获得所有结果。例如,搜索不应该对我正在查找的每个文件开始新的全面扫描。这就是为什么我认为 MFT 方式是最佳的,因为它可以快速迭代所有名称,并将每个名称与我的列表进行比较。

4

1 回答 1

5

解决问题的最佳方法似乎是使用 Windows 更改日志。

问题:如果没有为卷启用或卷不是 NTFS,则需要回退(如果是 NTFS,则启用更改日志)。您还需要管理员权限才能访问更改日志。

您可以使用 FSCTL_ENUM_USN_DATA 和 LowUsn=0 的 DeviceIOControll 获取文件。这直接访问 MFT 并将所有文件名写入提供的缓冲区。因为它顺序访问 MFT,所以它比 FindFirstFile API 更快。

于 2010-11-22T09:42:23.350 回答