Копирование файлов с помощью robo copy and process

Я создаю программу копирования файлов, которая будет копировать большое количество файлов (~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(); 
} 

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

5 ответов


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

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#.


вы должны позвонить File.Copy в цикле.


.УМК имеет следующие строки

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.УМК Я начинаю с 4 нескольких файлов копирования windows одновременно в соответствии с приведенными выше командами, он ждет для другого файла, так как у него есть время подождать, если файл используется другим процессом. Более быстрее, как это сделать работу одновременно.

теперь я разрабатываю GUI с помощью C# windows для запуска процесса, а не в командной консоли и
старт

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

однако, если он берет под контроль один процесс, то есть cmd.exe и и есть 4 процесса robocopy в менеджер задач. когда ЦМД.exe процесс завершается, он возвращает курсор на метку.текст "Sucesssfully завершенный." Пока процессы robocopy все еще работают. вы можете увидеть программы для Windows выполнение процесса копирования.

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

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

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


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