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

JJo*_*ohn 1 c#

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

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

Jer*_*son 6

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

.Net的早期版本必须使用一个较慢的方法,导致大型驱动器出现内存问题,@ anchet显示了一个很好的例子:在.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
Run Code Online (Sandbox Code Playgroud)

%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
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

在VS2010中打开VisualLogParser解决方案,忽略调试提示,解决方案加载后,F5,将组合框设置为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
Run Code Online (Sandbox Code Playgroud)

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