используя robocopy с C# Foreach.Parallel - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть информация об исходных и целевых директориях для нескольких местоположений в Datatable.

Я перебираю данные, используя параллель foreach, и затем выполняются две задачи: Скопировать файлы в dest и переименовать скопированный файл в Dest.

При этом иногда я получаю ошибки вроде: ОШИБКА 32 (0x00000020) Доступ к исходному каталогу Процесс не может получить доступ к файлу, поскольку он используется другим процессом. , ОШИБКА 32 (0x00000020) Доступ к каталогу назначения Процесс не может получить доступ к файлу, потому что он используется другим процессом.

И во время переименования я получаю сообщение об ошибке как Ошибка переименования файла, процесс не может получить доступ к файлу, потому что он используется другим процессом.

Например,

   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 потока выполняются параллельно, но выполнение отдельных потоков выполняется последовательно, т.е. сначала копируют, а затем renameFiles. Поэтому я не понимаю, почему я получаю ошибки, упомянутые выше.

Примечание: пути назначения одинаковы для всех

...