【问题标题】:Searching files in NTFS在 NTFS 中搜索文件
【发布时间】:2009-11-23 16:40:00
【问题描述】:

我们有一个相当大的磁盘阵列,上面大约有​​ 2-3 百万个 XML 文件。磁盘使用 NTFS 格式化,我们想使用通配符搜索文件系统。所以像 * SomePartOfTheFilename * 这样的东西是一个典型的搜索查询。

我们正在使用 .Net,发现使用 DirectoryInfo 似乎很慢。

DirectoryInfo directoryInfo = new DirectoryInfo(directory);

List<FileInfo> fileInfos = directoryInfo.GetFiles(searchString, SearchOption.AllDirectories).ToList();

使用循环和递归也很慢。

我们可以使用较低级别的 API 调用来直接搜索 NTFS 索引吗?

从命令行使用 dir * SomePartOfTheFilename * /s 几乎是即时的。有什么可以利用的吗?

【问题讨论】:

  • cygwin 中的 find 是否也能很快完成,还是与您的 .net 代码速度相似?如果是这样,它可能是 cmd.exe 和预建索引之间的一些超级秘密 MS 集成。
  • 是否有任何特殊原因您没有使用索引服务(如下所述)或一些自制解决方案构建外部索引?搜索文件系统不仅对您来说很慢,而且如果磁盘磁头最终在试图为竞争请求提供服务时挣扎,您可能会减慢其他人正在做的工作......
  • 我们希望 NTFS 索引足够快,我们可能会为文件创建自己的索引,但想先探索其他选项。
  • 我已经开始简单地创建一个文本文件(想想:dir /s /b C:\ > filelist.txt)作为索引。我发现 Windows(在 win7 上)文件索引非常慢并且通常不可靠。 Windows 索引经常找不到我知道的文件,我不得不强制重建来解决问题。搜索文本文件既快速又可靠,但并不理想。

标签: c# search wildcard ntfs


【解决方案1】:

我不确定您是否可以使用索引服务,但它可能对您尝试做的事情很方便:

http://msdn.microsoft.com/en-us/library/ee805985%28VS.85%29.aspx

http://www.codeproject.com/KB/database/Indexing_Service_HOW-TO.aspx

它允许您针对计算机上文件的 NTFS 索引创建复杂的查询。

【讨论】:

  • 嗨 Scott 谢谢你的想法,虽然我不确定索引服务在这里是否合适。我认为索引服务会创建文件内容和文件名的索引,因此我认为我们最终会得到一个巨大的索引。我们的磁盘大约 500Gb。我们只对搜索文件名感兴趣。我想知道是否可以将索引服务配置为仅对文件名进行索引?-需要看看...
【解决方案2】:

您可以直接使用 MFT(参见:NTFS Wiki)。那是有关文件的所有信息所在的数据表。您可以查看 MFT 的结构,例如 herehere。 Windows API 最终位于同一个表中,因此您也可以尝试加快搜索速度,以确保在搜索之前将其在内存中分页(例如 c:\$Mft 的简单读取就足够了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多