使用机器人复制和处理进行文件复制

时间:2011-10-25 14:21:38

标签: c# windows file copy robocopy

我正在创建一个文件复制程序,它将使用ROBOCOPY命令复制大小约为50 KB的大量文件(~100,000)。

对于每个文件,我正在创建一个新进程并传递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 个答案:

答案 0 :(得分:12)

这个问题有点陈旧,但我想我会回答帮助仍然落在它上面的人。我写了一个名为RoboSharp(https://github.com/tjscience/RoboSharp)的库,它将Robocopy的所有优点带到了c#。如果您需要在c#中使用Robocopy的强大功能,请查看。

答案 1 :(得分:2)

您应该循环调用File.Copy

答案 2 :(得分:2)

我会使用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
}

答案 3 :(得分:2)

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

答案 4 :(得分:0)

.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#窗口开发GUI以运行该过程而不是命令控制台和
   启动

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

但是,如果它控制了一个进程,即cmd.exe,并且有4个robocopy进程   任务管理器。当cmd.exe进程完成时,它将光标返回到label.text“成功   已完成“。虽然仍然存在robocopy进程。您可以看到robocopy窗口   进行复制过程。

以下是问题:我想控制所有进程(cmd.exe和robocopy.exe)   以编程方式在C#中,这样当label.text只显示“成功完成”时   当所有命令都成功完成时“,如果一个命令失败,则GUI中没有任何意义。

选项2(类似于上面写的Biju):从中删除robocopy命令脚本是否更好  sample.cmd(批处理文件)文件并编写代码来运行C#中的4个robocopy行,但是如何运行  robocooy脚本行写的.cmd文件,因为他们也有参数。我的代码运行每个robocopy  然后每个进程将返回到下一行代码,如果失败,我们可以捕获错误和  显示在消息框中。

希望这会有所帮助......但是,如果有人可以改进的话,我正在寻找更好的方法。