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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用机器人复制和处理进行文件复制相关的知识,希望对你有一定的参考价值。

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

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

答案

我只想使用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
}
另一答案

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

另一答案

你应该循环调用File.Copy

另一答案
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
另一答案

.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,并且taskmanager中有4个robocopy进程。当cmd.exe进程完成时,它将光标返回到label.text“Sucesssfully completed”。虽然robocopy进程仍在运行。你可以看到复制过程中的robocopy窗口。

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

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

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

以上是关于使用机器人复制和处理进行文件复制的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用支持片段管理器时复制片段

有趣的 C++ 代码片段,有啥解释吗? [复制]

dd---复制文件并对原文件的内容进行转换和格式化处理

Discord.py 让机器人复制每条消息,包括文件

Android:单击片段中的按钮时如何通知活动? [复制]

如何将 .mat 文件导入 Jupyter notebook 以在 scikit-learn 中使用它们进行机器学习? [复制]