Самый эффективный способ найти все исполняемые файлы на диске с помощью C#?

Какой самый эффективный способ найти все исполняемые файлы на диске с помощью C#?

Это будет сделано в фоновом режиме в программе, поэтому использование диска должно быть как можно меньше.

1 ответ

Решение

Ссылка, которую вы предоставили, является наиболее эффективным способом в C# (с.Net 4.0): метод Directory.EnumerateFiles

В предыдущих версиях.Net использовался более медленный метод, который вызывал проблемы с памятью на больших дисках, @hatchet показал отличный пример: есть ли более быстрый способ рекурсивного сканирования каталога в.NET?

Я бы не предложил использовать TPL, как здесь упоминает Джон Скит: Task Parallel Library для обхода каталога

Если вы видите первый комментарий в этой ссылке MSDN: итерация файловых каталогов с помощью параллельного класса, я даже не думаю, что Microsoft также имела успех с этим методом TPL.

Другое предложение, которое у меня есть, - это использование LogParser, и вы можете использовать его с C#! Это бесплатный продукт Microsoft, но я не уверен насчет разрешений на перераспределение, я должен был включить его в свой пакет отдельно в прошлый раз, когда использовал его. Он полон на лету, быстрее, чем скоростной поезд!

Согласно комментарию @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

РЕДАКТИРОВАТЬ

Спасибо за откровенные парни! Я сделал это приложение EventAnalyzer в 2005 году (до выпуска.net 2.0), и поскольку предложение Log Parser было настолько популярным, я решил поделиться тем, как вы можете использовать LogParser в.Net

Хорошие люди на http://visuallogparser.codeplex.com/ предоставили нам исходный код.

Откройте решение VisualLogParser в VS2010, проигнорируйте подсказку об отладке, после загрузки решения 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

В то же время вы можете запустить любое другое приложение.Net, которое ищет каталоги и сравнивает результаты!!!

Другие вопросы по тегам