5

1 つのファイルを複数の場所に同時に(C# を使用して)コピーする方法を見つけたいと考えています。

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

私のテストが私に示した限りでは、

File.Copy() 

常にソースを再度読み取ります。

私が理解している限り、メモリを使用している間でも、そのメモリピースはロックされます。

したがって、基本的には、ハードドライブから再度読み取ることなく、「コピーと貼り付け」を1つの「コピー」と複数の「貼り付け」の形式に模倣したいと考えています。

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

それで、達成することさえ可能ですか?

4

1 に答える 1

10

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

UPDATEスループットを向上させるために、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");
于 2012-06-19T20:01:13.127 に答える