2016-07-07 15 views
0

私は相対パスである文字列のリストを持っています。私はまた、それらのファイルのルートパスを含む文字列を持っています。百万のファイルを削除する最速の方法

foreach (var rawDocumentPath in documents.Select(x => x.RawDocumentPath)) 
{ 
    if (string.IsNullOrEmpty(rawDocumentPath)) 
    { 
     continue; 
    } 
    string fileName = Path.Combine(storagePath, rawDocumentPath); 
    File.Delete(fileName); 
} 

問題は、私はすべてのファイルに対してPath.Combineを呼び出すことで、それは十分に遅いです:今、私はこのようにそれらを削除しています。 このコードを高速化するにはどうすればよいですか?フォルダ全体を削除することはできません。現在のディレクトリを変更することはできません(プログラム全体に影響するため)...

指定したディレクトリ内の複数のファイルを高速に削除できるクラスが必要です。あなたのディスクがそれを処理できる場合、parallizingは大いに役立つはずです

+2

通常の状態は、常にI/O操作がされている下で、あなたのコードを遅らせることは何も、ファイル操作でのボトルネックを参照してくださいすることはできません。たとえば、マルチスレッドを使用しようとする可能性があります。 files.AsParallel()。ForAll() –

+0

@MichaelSander私は知っていますが、ディスクはバッチで削除を整理することができます。 –

+0

もしあなたが何かの「すべて」であることがわかっていたら、「* .doc」タイプのアプローチをすることができますが、具体的なことをする必要があるときはもっと制限されています – BugFinder

答えて

1

documents.AsParallel().ForAll(
    document => 
    { 
     if (!string.IsNullOrEmpty(document.RawDocumentPath)) 
     { 
      string fileName = Path.Combine(storagePath, document.RawDocumentPath); 
      File.Delete(fileName); 
     } 
    }); 
+0

まあ、ForAll +ネイティブのFileDeleteがここに答えているようです。興味深い、some1 downvoted、しかし理由について書いていない:)いくつかの人々は本当に奇妙な... –

関連する問題