В настоящее время я пишу себе небольшую программу резервного копирования C#. Я использую стандартную форму Windows для интерфейса и вызываю cmd.exe как новый процесс, а затем использую XCOPY из этого нового процесса. Все работает отлично, за исключением последней функции, которую я хочу добавить, а именно возможности прерывания операции.
Из встроенной командной строки я могу сделать это аккуратно с помощью Ctrl + C, но, как я ни старался, я не могу воспроизвести эту функциональность, используя подход winforms и process. Я попытался перенаправить стандартный ввод и использовать его для отправки 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();
Заранее большое спасибо за любую помощь, которую кто-либо может предложить.