【问题标题】:File copy using robo copy and process使用机器复制和处理的文件复制
【发布时间】:2011-10-25 14:21:37
【问题描述】:

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

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

【问题讨论】:

  • 为什么不直接使用 File.Copy() 方法?
  • 您有什么要求? Robocopy 有很多功能(多线程、恢复、重试等),您对哪些功能感兴趣?
  • 您使用 RoboCopy 是否有特殊原因?
  • ROBYCOPY 比 File.Copy 快
  • 对。 ROBOCOPY 是一个不错的工具。请看这个基准mickputley.net/2014/04/robocopy-benchmarks.html

标签: c# windows file copy robocopy


【解决方案1】:

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

【讨论】:

  • 太棒了!做我一直在寻找的一切!
【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • File.Copy 与 ROBOCOPY 相比确实很慢。对吗?
    • 可能没有考虑原始问题的提出方式。退出进程并等待它总体上可能会更慢。考虑到其他一些 cmets,可能仍想考虑执行 File.Copy,但在启动复制过程的方式上要有创意。可能考虑使用单独的线程进行无人值守的复制。
    • 您的答案没有用,因为 File.copy 不具备 robocopy 的所有功能。例如:长路径支持
    • 这不是问题
    • 当你尝试通过网络复制文件时,这会阻塞主线程
    【解决方案4】:

    你应该循环调用File.Copy

    【讨论】:

    • 如果他不想阻塞主线程,他可以在通知 UI 的单独线程(可能是BackgroundWorker)中完成这项工作...
    【解决方案5】:

    .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 开发 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(batch file) 文件并编写代码以在 C# 中运行 4 robocopy 行,但如何运行 robocooy 脚本行写入 .cmd 文件,因为它们也有参数。我编写代码运行每个 robocopy 然后每个进程都将返回到下一行代码,如果失败,我们可以捕获错误并 显示在消息框中。

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

    【讨论】:

    • @user2045570 你为什么不删除空行?
    • @TobiasKienzler 一定错过了。下次会注意空行。
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多