1

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

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

4

1 回答 1

6

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

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

我不建议使用 Jon Skeet 在这里提到的 TPL: Task Parallel Library for directory traversal

如果您在此MSDN 链接中看到第一条评论:Iterate File Directories with the Parallel Class我什至不认为 Microsoft 在这种 TPL 方法上取得了成功。

我的另一个建议是使用 LogParser,您可以将它与 C# 一起使用!它是一个免费的 Microsoft 产品,但我不确定 re-dist 权限,我上次使用它时必须将它单独包含在我的包中。它充满了飞行,比飞驰的火车还快!

根据@spender 评论,我找到了一个日志解析器示例,它可以找到 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

编辑

谢谢各位点赞!我在 2005 年(在 .net 2.0 发布之前)制作了这个Event Analyzer应用程序,由于 Log Parser 的建议非常受欢迎,我想我会分享在 .Net 中使用 LogParser 的方式

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

在VS2010中打开VisualLogParser解决方案,忽略调试提示,解决方案加载后,F5,将combo-box设置为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 应用程序!!!

于 2012-06-09T23:41:42.643 回答