2016-04-25 25 views
0

想我的文件与目录路径的商店名称,我想用任务LIB复制所有这些存储在列表中,从目标文件夹到目标文件夹中的文件复制多个文件。C#如何使用任务

List<string> filename = new List<string>(Enumerable.Range(0,8). 
Select(value=>"Z:\report_"+EndDate.Date.AddDays(value).ToString("dd-MM-yyyy")+".csv")); 

所以文件名变量有我必须复制的所有文件信息。现在告诉我如何使用任务来复制所有文件,并且还会有一个回调函数告诉我什么时候所有文件复制完成。寻找新鲜的代码。

这将是磁盘绑定操作,如果我使用任务的lib复制多个文件,然后同时过程会慢?

任何人都可以发布一些示例代码显示一个如何使用任务将在列表中自动循环播放,其中有路径文件的存储和使用任务LIB从一个文件夹复制同步所有文件到另一个文件夹。 感谢

+0

最简单的将是'Parallel.ForEach()' – Phaeze

+0

将ü介意张贴一些示例代码复制多个文件同时使用'Parallel.ForEach()' –

+0

在MSDN上读取它。 – dfdsfdsfsdf

回答

1

这里是一个很好的例子,如何通过使用parallel.foreach回路并联多个文件的循环:

https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx

的例子不工作的一些位图文件。您只需要替换其lambda表达式中的逻辑即可将当前文件复制到您想要的位置。

编辑:我扔在一起基础上,例如一些简单的示例代码在上面的链接:

List<string> filename = new List<string>(Enumerable.Range(0, 8).Select(value => "Z:\report_" + EndDate.Date.AddDays(value).ToString("dd-MM-yyyy") + ".csv")); 

String targetDirectoryPath = @"c:\my_target_folder\"; //TODO: Set this to your target directory. 
bool allowOverwrites = false; //Set this to true if you want to allow overwriting of existing files! 

Parallel.ForEach(filename, (currentFilePathToCopy) => 
{ 
    // The more computational work you do here, the greater 
    // the speedup compared to a sequential foreach loop. 
    String currentFilename = System.IO.Path.GetFileName(currentFilePathToCopy); 


    string targetFilePath = targetDirectoryPath + currentFilename; 

    try 
    { 
     System.IO.File.Copy(currentFilePathToCopy, targetFilePath, allowOverwrites); 
    } 
    catch (Exception caughtException) 
    { 
     //TODO: Handle copy error here! 
    }         
}); 
+0

如果我遵循或采用第三方物流,而不是复制一个接一个文件的文件,那么这将是更快,因为文件副本将磁盘绑定工作不是CPU绑定我猜。请分享你的建议。谢谢 –

+0

'Parallel.ForEach'可能在复制文件时创建竞争条件。你怎么想? –

+0

如果你确定你的文件列表中没有重复项目,那么你应该没问题。每微软:“不要让并行循环重复的实例如果一个对象出现比输入环路一次,它可能是两个并行的线程可以在同一时间更新的对象。”当两个或多个独立进程或线程尝试修改单个资源时,竞争条件就存在。只要你不想多次拷贝同一个文件,或者复制两个或更多的文件到同一个目标文件,那么你应该没问题。 – Robert