windows 使用robo拷贝和处理的文件拷贝

2guxujil  于 2023-02-13  发布在  Windows
关注(0)|答案(6)|浏览(243)

我正在创建一个文件复制程序,将复制大量的文件(~ 100,000)与大小~50 KB使用ROBOCOPY命令。
对于每个文件,我将创建一个新进程,并按如下方式传递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(); 
}

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

omqzjyyz

omqzjyyz1#

这个问题有点老了,但我想我会回答这个问题,以帮助任何人谁仍然降落在它。我写了一个库称为RoboSharp(https://github.com/tjscience/RoboSharp),把所有的优点在Robocopy的c#。看看如果你需要的权力Robocopy在c#。

p8h8hvxi

p8h8hvxi2#

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
nnt7mjpx

nnt7mjpx3#

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

bvpmtnay4#

应该在循环中调用File.Copy

zte4gxcn

zte4gxcn5#

Robocopy本身最多可以使用128个线程。这是一个巨大的差异。默认情况下它使用8个线程。
参见https://pureinfotech.com/robocopy-multithreaded-file-copy-windows-10/

zrfyljdw

zrfyljdw6#

. 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个多窗口,按照上面的命令同时复制文件,它等待另一个文件,因为它有等待时间,如果文件正在被另一个进程使用。
现在我正在开发GUI,使用C#窗口来运行该过程,而不是转到命令控制台和
启动

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

但是,如果它控制一个进程(即cmd.exe和),并且taskmanager中有4个robocopy进程。当cmd.exe进程完成时,它会将光标返回到label. text "Successfully completed"。当仍有robocopy进程在运行时,您可以看到robocopy窗口正在执行复制进程。
问题是这样的:我想在C#中以编程方式控制所有进程(cmd.exe和robocopy.exe),这样当标签. text应该显示"successfully completed"时,只有当所有命令都成功完成时,"如果一个失败,那么GUI中就没有意义了。
选项2(类似于Biju上文所述):从sample. cmd(批处理文件)文件中删除robocopy命令脚本并编写代码以运行C#中的4个robocopy行是否更好,但如何运行. cmd文件中编写的robocooy脚本行是否更好,因为它们也有参数。I代码运行每个robocopy进程,然后每个进程都将返回到下一行代码,如果失败,我们可以捕获错误并显示在消息框中。
希望这会有帮助...然而,我正在寻找更多更好的方法,如果有人能改进相同的。

相关问题