我目前正在为自己编写一个小的 C# 备份程序。我正在为界面使用标准的 Windows 窗体,并将 cmd.exe 作为新进程调用,然后在这个新进程中使用 XCOPY。除了我要添加的最后一个功能,即中断操作的能力外,一切都运行良好。
在 native 命令提示符下,我可以使用 ctrl+c 干净地完成此操作,但尽我所能,我无法使用 winforms 和进程方法复制此功能。我试过重定向标准输入并使用它来发送 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();
非常感谢任何人可以提供的任何帮助。
最佳答案
我不想成为专家,但我认为您最好在程序中进行复制。使用 System.IO 命名空间中的文件、目录和其他类,这非常简单,让您完全控制报告进度、取消操作等。
关于c# - 将 ctrl+c 发送到 c# 中的 cmd.exe 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/824925/