Копирование файла с использованием робо-копирования и обработки

Я создаю программу копирования файлов, которая будет копировать большое количество файлов (~100 000) размером ~50 КБ с помощью команды ROBOCOPY.

Для каждого файла я создаю новый процесс и передаю команду и аргументы ROBOCOPY следующим образом:

using (Process p = new Process)
{
    p.StartInfo.Arguments = string.Format("/C ROBOCOPY {0} {1} {2}", 
            sourceDir, destinationDir, fileName);
    p.StartInfo.FileName = "CMD.EXE";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;                    
    p.Start();
    p.WaitForExit(); 
} 

Вместо того, чтобы создавать процесс для каждого файла, я ищу лучший подход, который будет хорош с точки зрения производительности и дизайна. Может кто-нибудь предложить лучший метод?

6 ответов

Решение

Я бы просто использовал System.IO. Должно быть достаточно быстро, и ваше имя файла может быть подстановочным знаком.

using System.IO;
// snip your code... providing fileName, sourceDir, destinationDir
DirectoryInfo dirInfo = new DirectoryInfo(sourceDir);
FileInfo[] fileInfos = dirInfo.GetFiles(fileName);
foreach (FileInfo file in fileInfos)
{
    File.Copy(file.FullName, Path.Combine(destinationDir, file.Name), true);  // overwrites existing
}

Этот вопрос немного устарел, но я подумал, что смогу ответить, чтобы помочь любому, кто все еще приземлится на него. Я написал библиотеку под названием RoboSharp ( https://github.com/tjscience/RoboSharp), которая привносит все преимущества Robocopy в C#. Посмотрите, если вам требуется мощь Robocopy в C#.

Process p = new Process();
p.StartInfo.Arguments = string.Format("/C Robocopy /S {0} {1}", "C:\\source", "C:\\destination");
p.StartInfo.FileName = "CMD.EXE";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.Start();
p.WaitForExit(); 

/C Robocopy -> this is a command to run robocopy
/S -> This will help to copy sub folders as well as Files

Вам следует позвонить File.Copy в петле.

Robocopy может использовать до 128 потоков. Это имеет огромное значение. По умолчанию используется 8.

См. https://pureinfotech.com/robocopy-multithreaded-file-copy-windows-10/

.cmd имеет следующие строки

Start ROBOCOY src dest a* b* c*    /z /w:1 r:1
Start ROBOCOY src dest d* e* f* g* /z /w:1 r:1
Start ROBOCOY src dest h* K* P* Y*  /z /w:1 r:1
Start ROBOCOY src dest xry* srp*  /z /w:1 r:1

Когда я запускаю> Robocopy sample.cmd, я начинаю с 4-х нескольких окон, копирующих файлы одновременно, как указано выше, он ожидает другого файла, поскольку у него есть время ожидания, если файл используется другим процессом. Это быстрее, так как он делает работу одновременно.

Сейчас я разрабатываю графический интерфейс с использованием C# windows для запуска процесса, вместо этого собираюсь в командную консоль и
Начните

  main()
  { 
  process.start( "path of sample.cmd" )
  process.waitforexit()
  label.text=" sucessful copy"
  }

Однако, если он берет на себя управление одним процессом, т.е. cmd.exe, и в taskmanager есть 4 процесса robocopy. когда процесс cmd.exe завершается, он возвращает курсор к label.text "Успешно завершено". Пока есть процессы робокопии, все еще запущенные. вы можете видеть окна robocopy, выполняющие процесс копирования.

Вот вопрос: я хочу получить программный контроль над всеми процессами (cmd.exe и robocopy.exe) в C#, так что когда label.text должен отображать "успешно завершено" только тогда, когда все команды успешно завершены ", если один сбой, то нет никакого смысла в GUI.

Вариант 2 (аналогично тому, как Biju написал выше): лучше ли удалять командные сценарии robocopy из файла sample.cmd(пакетный файл) и писать код для запуска 4 строк robocopy в C#, но как запустить написанную строку сценария robocooy. cmd файл, так как у них есть аргументы. Я выполняю код каждый процесс robocopy, затем каждый из них возвращается к следующей строке кода, и в случае неудачи мы можем перехватить ошибку и отобразить ее в окне сообщения.

Надеюсь, это поможет... Тем не менее, я ищу более лучший путь, если кто-то может улучшить то же самое.

Другие вопросы по тегам