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