首页 > 解决方案 > 将 robocopy 与 C# Foreach.Parallel 一起使用

问题描述

我有关于数据表中多个位置的源目录和目标目录的信息。

我正在使用 foreach 并行遍历数据表,然后执行两个任务,将文件复制到 dest 并在 Dest 上重命名复制的文件。

在这样做时,有时我会遇到错误,例如
ERROR 32 (0x00000020) Accessing Source Directory 该进程无法访问该文件,因为它正被另一个进程使用。,

ERROR 32 (0x00000020) Accessing Destination Directory 进程无法访问该文件,因为它正被另一个进程使用。

在重命名时,我收到 错误重命名文件错误,该进程无法访问该文件,因为它正在被另一个进程使用。

例如

   var options = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = 4
                };
    Parallel.foreach(datatableObj.AsEnumerable(), options, row =>{

    string sourcePath = row.Field<string>("source_path");
    string destPath = row.Field<string>("dest_path");
    string searchPattern = row.Field<string>("Search_pattern");

    List<string> files=Directory.GetFiles(sourcePath, searchPattern);
    string ROBOCOPY_STATIC_ARGUMENTS = @"/MT:32 /BYTES /COPY:DAT /NP /R:3 /W:1";
    foreach(string file in fIles)
    {
          CopyUsingRoboCopy(file,DestPath,ROBOCOPY_STATIC_ARGUMENTS);
          RenameFile(file,NewFileName+datetimewithmilliseconds.ext);
    }

});

作为以并行方式执行的 2 个线程,但单线程执行是顺序的,即首先复制然后重命名文件。所以我不明白为什么我会收到上面提到的错误。

注意:所有目标路径都相同

标签: c#multithreadingrobocopy

解决方案


推荐阅读