c# - 将 ctrl+c 发送到 c# 中的 cmd.exe 进程

标签 c# .net winforms cmd

我目前正在为自己编写一个小的 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/

相关文章:

c# - 使用c#将csv文件插入MYSQL表

c# - 如何在 C#/.NET 中测试一个值是否被装箱?

winforms - 按 CTRL-A 停止响铃 (WinForms)

c# - 从.Hide() 改成.Show() 的窗体无法最大化,为什么?

c# - 为什么我下载文件的代码会生成损坏的 PDF?

c# - 从大型 XML 文件中删除节点

c# - 如何从.NET用户界面将MySQL连接信息发送到数据访问层

c# - 是否有适用于 PayPal.Me 的 API? (PayPal.me 是另一种通过链接的支付功能)

c# - 点击datagrid View 的按钮列,一封自动邮件将被发送到邮件id

c# - 如果最后一个回调尚未完成,则忽略传入的流更新