2009-11-23 91 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就足夠了)。