Il modo più efficiente per trovare tutti i file exe su disco usando C #?

Qual è il modo più efficiente per trovare tutti i file exe su disco usando C #?

Sarà fatto in background thread in programma in modo che l’utilizzo del disco dovrebbe essere il più piccolo ansible.

Il collegamento che hai fornito è il modo più efficiente in C # (con .Net 4.0): metodo Directory.EnumerateFiles

Le versioni precedenti di .Net dovevano utilizzare un metodo più lento che causava problemi di memoria su dischi di grandi dimensioni, @hatchet ha mostrato un ottimo esempio: esiste un modo più rapido per eseguire la scansione di una directory in modo ricorsivo in .NET?

Non consiglierei di usare il TPL come fa qui Jon Skeet: Task Parallel Library per directory traversal

Se vedi il primo commento in questo link MSDN: Iterate Directory di file con la class parallela Non penso nemmeno che Microsoft abbia avuto successo con questo metodo TPL.

L’altro suggerimento che ho sta usando LogParser e puoi usarlo con C #! È un prodotto Microsoft gratuito ma non sono sicuro delle autorizzazioni di re-dist, dovevo includerlo nel mio pacchetto separatamente l’ultima volta che l’ho usato. Pieno di mosche, più veloce di un treno in corsa!

Come per il commento di @spender ho trovato un esempio di Log Parser che trova file datati 180 giorni e più vecchi, puoi provarlo e adattarlo se è utile:

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% potrebbe essere qualcosa come c: \ *. exe come mostrato nell’argomento c: \ temp \ *. *. Salvare il precedente come cc.sql, eseguirlo con la seguente syntax:

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

MODIFICARE

Grazie per i ragazzi di upvotes! Ho creato questa app Event Analyzer nel 2005 (prima di .net 2.0 è stata rilasciata) e poiché il suggerimento di Log Parser era così popolare ho pensato di condividere il modo in cui è ansible utilizzare LogParser in .Net

I bravi ragazzi su http://visuallogparser.codeplex.com/ ci hanno fornito il codice sorgente.

Aprire la soluzione VisualLogParser in VS2010, ignorare il prompt relativo al debug, dopo che la soluzione viene caricata, F5, impostare la casella combinata su FS (FileSystem), incollare questa query e premere vai.

 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 

Allo stesso tempo potresti desiderare di eseguire qualsiasi altra applicazione .Net che cerchi le directory e confrontare i risultati !!!