2009-11-23 32 views
5

遍歷使用通配符模式查找文件的目錄時,我們遇到了意外的性能問題。Win32 API FindFirstFile和FindNextFile性能vs命令行

我們有180個文件夾,每個文件夾包含10,000個文件。使用dir <pattern> /s的命令行搜索幾乎立即完成(< 0.25秒)。但是,從我們的應用程序,相同的搜索需要3-4秒。

我們最初嘗試使用System.IO.DirectoryInfo.GetFiles()SearchOption.AllDirectories,現在已經嘗試了Win32 API調用FindFirstFile()FindNextFile()

使用我們的代碼進行分析表明絕大多數執行時間都花費在這些調用上。

我們的代碼是基於以下博客文章:

http://codebetter.com/blogs/matthew.podwysocki/archive/2008/10/16/functional-net-fighting-friction-in-the-bcl-with-directory-getfiles.aspx

我們發現這是緩慢,更新GetFiles功能採取string搜索模式,而不是謂語。

任何人都可以闡明我們的方法可能會出現什麼問題嗎?

+0

你用什麼來從命令行進行搜索?難道它是使用Windows搜索索引來執行查詢,而不是逐個瀏覽每個文件? – 2009-11-23 10:29:19

+0

@Matt我們只是在做一個'dir/s'(已經更新了我的帖子)。 – 2009-11-23 10:33:46

+1

聽起來很可疑。我嚴重懷疑「dir」使用除FindFirstFile/FindNextFile之外的其他任何內容。也許你誤用了它們。你能提供一個說明你如何使用它們的片段嗎? – sharptooth 2009-11-23 10:36:21

回答

2

你可以試一下執行FindFirstFileFindNextFile我一下blogged一下。

+0

我們的方法與Darin非常相似 – 2009-11-23 10:40:50

+0

我測試了我的解決方案,需要230毫秒枚舉包含> 100K文件的目錄。 – 2009-11-23 10:45:21

+0

FindFirstFileEx(... FindExInfoBasic ...)可以實現進一步的加速。 – MSalters 2009-11-23 11:41:18

0

嘗試IShellFolder::EnumObjectsSHGetDataFromIDList/IShellFolder::GetAttributesOf

Pro /缺點here

7

在使用FindFirstFileEx我的測試與FindExInfoBasicFIND_FIRST_EX_LARGE_FETCH比普通用FindFirstFile快得多。

使用大約300,000個文件掃描20個文件夾需要661秒的FindFirstFile和11秒的FindFirstFileEx。對相同文件夾的後續調用時間不到一秒鐘。 HANDLE h = FindFirstFileEx(search.c_str(),FindExInfoBasic,& data,FindExSearchNameMatch,NULL,FIND_FIRST_EX_LARGE_FETCH);