Win32 API FindFirstFile和FindNextFile性能与命令行

时间:2009-11-23 10:26:37

标签: .net performance winapi

当遍历使用通配符模式查找文件的目录时,我们遇到了意外的性能问题。

我们有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搜索模式而不是谓词。

任何人都可以对我们的做法可能出现的问题有所了解吗?

3 个答案:

答案 0 :(得分:9)

在我的测试中使用 FindFirstFileEx FindExInfoBasic FIND_FIRST_EX_LARGE_FETCH 比普通 FindFirstFile 快得多。

使用FindFirstFile扫描包含约300,000个文件的20个文件夹花费661秒,使用FindFirstFileEx扫描花费11秒。对相同文件夹的后续调用只需不到一秒钟。

HANDLE h = FindFirstFileEx(search.c_str(),FindExInfoBasic,&amp; data,FindExSearchNameMatch,NULL,FIND_FIRST_EX_LARGE_FETCH);

答案 1 :(得分:3)

您可以尝试FindFirstFileFindNextFileblogged一次的实施。

答案 2 :(得分:0)

使用IShellFolder::EnumObjects尝试SHGetDataFromIDList/IShellFolder::GetAttributesOf

Pro / Cons here