使用C#在磁盘上查找所有exe文件的最有效方法?

使用C#在磁盘上查找所有exe文件的最有效方法是什么?

它将在程序中的后台线程中完成,因此磁盘使用量应尽可能小。

您提供的链接是C#中最有效的方式(使用.Net 4.0): Directory.EnumerateFiles方法

.Net的早期版本必须使用较慢的方法导致大型驱动器上的内存问题,@ hatchet显示了一个很好的例子: 在.NET中以递归方式扫描目录是否有更快的方法?

我不建议像Jon Skeet在这里提到的那样使用TPL: 用于目录遍历的任务并行库

如果您在此MSDN链接中看到第一条评论:使用并行类迭代文件目录我甚至不认为Microsoft使用此TPL方法也取得了成功。

我的另一个建议是使用LogParser,你可以在C#中使用它! 它是一个免费的微软产品,但我不确定re-dist权限,我不得不在上次使用它时将它单独包含在我的包中。 它飞得很快,比高速列车快!

根据@spender的评论,我找到了一个Log Parser示例 ,它可以找到180天及更久的文件,你可以尝试一下,如果有用的话可以调整它:

SELECT ContentPath, [Days (Old)], FileName, [Creation Date Time] USING creationtime AS [Creation Date Time], TO_DATE([Creation Date Time]) AS Cdate, SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), Cdate) AS Days, DIV(TO_INT(Days),86400) As [Days (Old)], EXTRACT_PATH(TO_LOWERCASE(path)) AS ContentPath, TO_LOWERCASE(name) AS FileName FROM %source% WHERE (attributes NOT LIKE 'D%') AND ([Days (Old)] >= TO_INT('%day%')) ORDER BY [Creation Date Time] DESC 

%source%可能类似于c:\ * .exe,如参数c:\ temp \ *。*中所示。 将上面保存为cc.sql,使用以下语法运行它:

  C:\Temp\Tools\Logparser>LogParser.exe file:cc.sql?source="c:\temp\*.*"+day="180" -i:FS -preserveLastAccTime -rtp:-1 

编辑

感谢upvotes人! 我在2005年制作了这个事件分析器应用程序(在.net 2.0发布之前)并且由于Log Parser建议如此受欢迎,我想我会分享你在.Net中使用LogParser的方式。

http://visuallogparser.codeplex.com/上的好人为我们提供了源代码。

在VS2010中打开VisualLogParser解决方案,忽略调试提示,解决方案加载后,F5,将combobox设置为FS(FileSystem),粘贴此查询并按go。

 SELECT  ContentPath, [Days (Old)], FileName, [Creation Date Time]  USING creationtime AS [Creation Date Time],  TO_DATE([Creation Date Time]) AS Cdate,  SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), Cdate) AS Days,  DIV(TO_INT(Days),86400) As [Days (Old)],  EXTRACT_PATH(TO_LOWERCASE(path)) AS ContentPath,  TO_LOWERCASE(name) AS FileName FROM 'c:\*.exe' WHERE (attributes NOT LIKE 'D%') AND ([Days (Old)] >= TO_INT('180')) ORDER BY [Creation Date Time] DESC 

与此同时,您可能希望运行任何其他.Net应用程序,搜索目录并比较结果!