我正在编写一个小的C#备份程序。我使用标准的Windows表单作为界面,并调用cmd.exe作为新进程,然后在这个新进程中使用XCOPY。一切都很顺利,除了我想添加的最后一个功能——中断操作。
从本地命令提示符中,我可以通过ctrl+c干净地完成此操作,但是尝试了很多次后,我无法使用winforms和进程方法来复制此功能。我尝试重定向standardinput并使用它将consolespecialkeys.ControlC发送到进程,我还尝试发送0x03和“/x03”,这两个我在其他论坛帖子上读到的是ctrl+c的十六进制代码。但是我发送的任何内容都没有被注册,退出进程会杀死用户界面,但会让xcopy.exe在后台运行。手动终止xcopy.exe会导致复制的文件只有一半,且已损坏,这不是在命令提示符中使用ctrl+c时发生的情况。
我是否遗漏了一些显而易见的东西?我对C#还比较陌生,所以我承认这很可能是我的问题,或者我对进程如何与cmd.exe一起工作存在误解。但是,由于进程支持标准输入重定向,因此似乎应该可以解决...至少对我来说是这样。如果有帮助的话,我在下面放了我的代码基本大纲,以便确定我出错的地方。
string XCopyArguments = "\"" + dir.FullName + "\" \"" + destination + "\" /D /S /I /E";
Process XCopyProcess = new Process();
ProcessStartInfo XCopyStartInfo = new ProcessStartInfo();
XCopyStartInfo.FileName = "CMD.exe ";
XCopyStartInfo.RedirectStandardError = true;
XCopyStartInfo.RedirectStandardOutput = true;
XCopyStartInfo.RedirectStandardInput = true;
XCopyStartInfo.UseShellExecute = false;
XCopyStartInfo.CreateNoWindow = true;
XCopyStartInfo.Arguments = " /D /c XCOPY " + XCopyArguments;
XCopyProcess.EnableRaisingEvents = true;
XCopyProcess.StartInfo = XCopyStartInfo;
XCopyProcess.Start();
XCopyProcess.WaitForExit(15000);
int ExitCode = XCopyProcess.ExitCode;
if (ExitCode > 0 & !XCopyProcess.HasExited)
{
XCopyProcess.Kill();
}
XCopyProcess.Dispose();
非常感谢您提前提供的任何帮助。