2009-11-23 114 views
3

我们有一个相当大的磁盘阵列,其上有大约2-3百万个XML文件。磁盘使用NTFS格式化,我们希望使用通配符搜索文件系统。所以像* SomePartOfTheFilename *就是一个典型的搜索查询。在NTFS中搜索文件

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

DirectoryInfo directoryInfo = new DirectoryInfo(directory); 

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

使用循环和递归也很慢。

是否有较低级别的API调用可用于直接搜索NTFS索引?

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

+1

cygwin中的_find_是否也能很快完成,还是与您的.net代码速度相似?如果是这样,那么它可能是cmd.exe和预建索引之间的一些超级秘密MS集成。 – 2009-11-23 18:48:23

+1

是否有任何特别的原因,你没有建立一个外部索引,或者使用索引服务(如下所示)或一些家庭酿造解决方案?不仅是为你搜索一个文件系统缓慢,而且你有机会放慢其他人正在做的工作,如果磁盘头最终会围绕试图处理竞争请求而发生颠簸...... – 2009-11-24 08:22:43

+0

我们希望依靠NTFS索引足够快,我们可以创建我们自己的文件索引,但首先想要探索其他选项。 – Tim 2009-11-24 10:56:02

回答

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索引。

+0

嗨斯科特 感谢您的想法,虽然我不确定索引服务将适合在这里。我认为索引服务会创建文件内容的索引以及文件名,因为我认为我们最终会得到一个巨大的索引。我们的磁盘大约500Gb。 我们只对搜索文件名感兴趣。我想知道是否可以将索引服务配置为只索引文件名? - 看看... – Tim 2009-11-24 11:06:25

0

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