1

C#を使用してディスク上のすべてのexeファイルを見つける最も効率的な方法は何ですか?

プログラムのバックグラウンド スレッドで実行されるため、ディスクの使用量はできるだけ少なくする必要があります。

4

1 に答える 1

6

あなたが提供したリンクは、C#(.Net 4.0を使用)で最も効率的な方法です: Directory.EnumerateFilesメソッド

.Net の以前のバージョンでは、大きなドライブでメモリの問題を引き起こす低速の方法を使用する必要がありましたが、@hatchet は素晴らしい例を示しました

Jon Skeet がここで言及しているように、TPL を使用することはお勧めしません: ディレクトリトラバーサル用のタスク並列ライブラリ

このMSDN リンクの最初のコメントが表示された場合: 並列クラスを使用してファイル ディレクトリを反復処理する場合、Microsoft がこの TPL メソッドで成功したとは思いません。

私が持っている他の提案は、LogParser を使用することであり、C# で使用できます。これは無料のマイクロソフト製品ですが、再配布の許可についてはわかりません。前回使用したときにパッケージに個別に含める必要がありました。スピード違反の電車よりも速く、ハエでいっぱいです!

@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:\temp\*.* に示されているように、c:\*.exe のようなものである可能性があります。上記を 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 がリリースされる前) に作成しましたが、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

同時に、ディレクトリを検索して結果を比較する他の .Net アプリケーションを実行したいかもしれません!!!

于 2012-06-09T23:41:42.643 に答える