Самый эффективный способ найти все исполняемые файлы на диске с помощью 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, которое ищет каталоги и сравнивает результаты!!!