2012-06-19 33 views
5

複数の場所に1つのファイルをコピーする方法を探したい(C#付き)。1つのファイルを複数の場所に同時にコピーする方法

は、元のファイルを一度だけ読み込み、そのファイルを(ローカルネットワーク上の)別の場所に「貼り付ける」ことを望まないということを意味します。

限り私のテストは私を示したとして、

File.Copy() 

は常に再びソースを読み込みます。

私が知る限り、メモリを使用していても、そのメモリはロックされています。

基本的には、コピーと貼り付けをコピーして複数の「貼り付け」の形にしたいのですが、をもう一度読み直してください。

なぜですか? 最終的には、1つのフォルダ(1GB以上)を多くのコンピュータにコピーする必要があり、ボトルネックはソースファイルを読むために必要な部分です。

だから、 達成することも可能ですか?

+2

http://www.java2s.com/Code/CSharp/File-Stream/illustratesuseofMemoryStreams.htm? – Holystream

+1

あなたはそれに問題がありますか、ちょうど科学的であるか、コードを時期尚早に最適化していますか? – ivowiblo

+0

@ivowiblo:私は2時間(10台のコンピュータで15分)かかるプロセスを最適化しようとしています。私は "正常な"コピーより良い方法があると確信しています。 – itsho

答えて

9

File.Copyユーティリティメソッドを使用するのではなく、ソースファイルをFileStreamとして開き、必要な多くの宛先ファイルに対して多くのFileStreamsを開き、ソースから読み取り、各宛先ストリームに書き込むことができます。

更新スループットを向上させるためにParallel.ForEachを使用してファイルを書き込むように変更しました。

public static class FileUtil 
{ 
    public static void CopyMultiple(string sourceFilePath, params string[] destinationPaths) 
    { 
     if (string.IsNullOrEmpty(sourceFilePath)) throw new ArgumentException("A source file must be specified.", "sourceFilePath"); 

     if (destinationPaths == null || destinationPaths.Length == 0) throw new ArgumentException("At least one destination file must be specified.", "destinationPaths"); 

     Parallel.ForEach(destinationPaths, new ParallelOptions(), 
         destinationPath => 
          { 
           using (var source = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
           using (var destination = new FileStream(destinationPath, FileMode.Create)) 
           { 
            var buffer = new byte[1024]; 
            int read; 

            while ((read = source.Read(buffer, 0, buffer.Length)) > 0) 
            { 
             destination.Write(buffer, 0, read); 
            } 
           } 

          }); 
    } 
} 

使用法:

FileUtil.CopyMultiple(@"C:\sourceFile1.txt", @"C:\destination1\sourcefile1.txt", @"C:\destination2\sourcefile1.txt"); 
+0

Brilliant!私は試してみて、おそらく答えとしてマークします。 – itsho

+0

今日は試しましたが、まだ遅いです(1480ファイル、合計10MB、2台のコンピュータで約4分かかります)。あなたの答えDIDは一度だけ読むことができましたが、まだそれは時間を惜しまなかったことに注意してください。私は明日それをプロファイリングし、より良い返答を返します。とにかく、私はスレッドを並列コピーを行うことを検討しています... – itsho

+0

実際には、ファイルを一度だけ読み込みますが、一度に1つのファイルをストリームに書き込みます。多分パラレルプログラミングAPIがこれを助けることができます。それを使うために私の答えを書き直すことができるかどうかがわかります。 – HackedByChinese

関連する問題