12

我正在创建一个文件复制程序,它将使用 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(); 
} 

我不是为每个文件创建一个进程,而是寻找一种更好的方法,这在性能和设计方面都会很好。有人可以提出更好的方法吗?

4

5 回答 5

22

这个问题有点老了,但我想我会回答以帮助仍然登陆它的任何人。我编写了一个名为 RoboSharp ( https://github.com/tjscience/RoboSharp ) 的库,它将 Robocopy 中的所有优点带到了 c# 中。看看你是否需要 c# 中 Robocopy 的强大功能。

于 2014-04-22T04:07:55.777 回答
5
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
于 2016-07-28T06:55:32.667 回答
2

你应该File.Copy循环调用。

于 2011-10-25T14:24:30.987 回答
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
}
于 2011-10-25T14:39:47.377 回答
-1

.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 个多个窗口同时复制文件开始,它等待另一个文件,因为它有等待时间,如果文件正在被另一个进程使用。Is 更快,因为它同时工作。

现在我正在使用 C# windows 开发 GUI 来运行进程,而不是转到命令控制台并
启动

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

但是,如果它控制一个进程,即cmd.exe,并且在taskmanager 中有4 个robocopy 进程。当 cmd.exe 进程完成时,它会将光标返回到 label.text “成功完成”。虽然仍有 robocopy 进程仍在运行。您可以看到 robocopy 窗口正在执行复制过程。

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

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

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

于 2013-09-03T06:56:35.430 回答