Копирование файлов с помощью 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#.
.УМК имеет следующие строки
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