『QQ:1353814576』

c#实现调用cmd执行XCopy命令进行文件目录快速备份的应用代码实例


元旦前接了一单小私活,之所以找到我大概是因为是TK精灵进程守护工具的用户,觉得体验还不错就找到了我这边希望定制一款文件夹备份小工具.

用户需求大概描述

  1. 核心需求A、B两个目录 监听A的所有文件内容变动备份至B目录
  2. 界面做好看点,集成多个备份任务(原本用的是运行多个bat脚本执行xcpoy进行备份)
  3. 界面需要输出运行日志 以及失败的日志记录 便于后续排查

原本听完需求觉得功能挺简单的,元旦放完假后就开始开发,很快就做出了雏形功能,功能实现的也比较简单,就是简单的目录遍历 然后加一个目录监听。自我测试感觉还挺不错的,于是就交给用户试用,然而用户反馈软件使用却不太理想,比原先使用的xcpoy方式要慢非常多,中间还电话沟通了几次,沟通过程感觉还是很舒适的。

做了很多次备份效率测试,最终结果都是.net 提供的目录遍历 进行大批量(大概有200多GB的数据量)进行复制备份的效率始终比xcopy方式差非常多,最终还是使用了c#调用cmd执行xcpoy的方式进行被反然后读取返回结果输出到前端日志界面。

以下是实现c#调用xcopy备份目录的核心代码

Process XCopyProcess;

string xcopy = $"xcopy \"{this.sourcePath}\" \"{this.outputPath}\" /c/e/I/d/h/r/y";
ProcessStartInfo processStartInfo = new ProcessStartInfo()
{
     UseShellExecute = false, 
     FileName = "cmd.exe",
     CreateNoWindow = true,
     RedirectStandardInput = true,  
     RedirectStandardError = true,
     RedirectStandardOutput = true
};

this.XCopyProcess.StartInfo = processStartInfo;
this.XCopyProcess.Start();
string cmdstr = xcopy;
await this.XCopyProcess.StandardInput.WriteLineAsync(cmdstr); 
this.XCopyProcess.StandardInput.AutoFlush = true; 
await this.XCopyProcess.WaitForExitAsync();

完工的界面效果图

c#实现调用XCopy命令实现目录备份的应用代码实例