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

本文关键字:复制 处理 机器人 文件 | 更新日期: 2023-09-27 18:12:26

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

对于每个文件,我创建一个新进程,并传递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(); 
} 

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

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

这个问题有点老了,但我想我应该回答一下,以帮助那些仍然在这个问题上着陆的人。我编写了一个名为RoboSharp的库(https://github.com/tjscience/RoboSharp),它将Robocopy中的所有优点都引入了c#。如果您需要c#中的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

我会使用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本身可以使用多达128个线程。这有很大的不同。默认值为8。

见https://pureinfotech.com/robocopy-multithreaded-file-copy-windows-10/

。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进程taskmanager。当cmd.exe进程完成时,它返回光标到标签。文本"Sucesssfully完成"。虽然机器人复制过程仍在运行。你可以看到机器复制的Windows正在复制过程中

问题是:我想控制所有进程(cmd.exe和robocopy.exe)在c#中编程,以便当标签。文本应该只显示"成功完成"当所有命令都成功完成时",如果一个命令失败了,那么GUI就没有意义了。

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

希望这将帮助…然而,我正在寻找更好的方法,如果有人能在相同的改进。