如何在一个文件同时拷贝到很多地方(How to copy one file to many loca

2019-09-18 06:52发布

我想找到一种方法来拷贝一个文件到多个地点同时 (用C#)。

意味着我不希望被读取原始文件只有一次,和“粘贴”的文件移动到另一个位置(本地网络)开始的。

至于我的测试表明我来说,

File.Copy() 

总是会再次读取源。

而且据我了解,即使在使用的内存,该内存块被锁定。

所以基本上,我想模仿“复制粘贴”到一个“副本”形式,并且多个“贴”, 而无需从硬盘读重试。

为什么呢? 因为最终,我需要一个文件夹复制(1GB以上)到多台计算机,并瓶颈是我需要阅读源文件的一部分。

因此,它甚至有可能实现吗?

Answer 1:

而不是使用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");


文章来源: How to copy one file to many locations simultaneously