Sanman Marathe Ответов: 2

Фоновый рабочий процесс


Моя программа запускает процесс, определение которого существует в другом классе. Недавно я добавил background worker для отображения состояния выполняемой работы при запуске процесса cmd.

код выглядит примерно так в презентаторе
string command = @"xcopy C:\test1.txt C:\test2.txt";
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = command;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.Start();
process.WaitForExit();
if(process.ExitCode == 0)
return true;
else
return false;



Проблема здесь в том, что процесс возвращает true, несмотря на то, что файл не копируется.

Когда я использую один и тот же код без какого-либо фонового работника, он работает нормально, однако использование его не делает работу.

Любая помощь будет оценена по достоинству.

Что я уже пробовал:

Также пробовать

string command = @"xcopy C:\test1.txt C:\test2.txt";
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.Start();
process.StandardInput.WriteLine(command);
process.StandardInput.Flush();
process.StandardInput.Close();
process.WaitForExit();
if(process.ExitCode == 0)
return true;
else
return false;

2 Ответов

Рейтинг:
2

OriginalGriff

С какой стати вы используете xcopy для копирования файла?
Просто используйте файл.Копирование вместо запуска отдельного процесса, и вы можете поймать любое исключение и вернуть свой код состояния в результате.

Если вы должны это сделать, то вам нужно поймать исключения - если xcopy не работает, процесс выдаст исключение (например, "файл не найден" выдаст система.ComponentModel. Win32Exception), и фоновый рабочий поток будет прерван, если вы его не обработаете. Вполне вероятно, что это происходит здесь.


Рейтинг:
0

#realJSOP

Попробуйте что-нибудь вроде этого:

StreamReader outputReader = null;
StreamReader errorReader = null;
bool success = false;
using (Process process = new Process()
        {
            StartInfo =  new ProcessStartInfo()
            {
                RedirectStandardError = true,
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true,
                FileName = "xcopy",
                Arguments = @"SourceFile c:\DestinationFile /e /y /I"
            }
        })
{
    try
    {
        bool processStarted = process.Start();
        if (processStarted)
        {
            //Get the output stream
            outputReader = process.StandardOutput;
            errorReader = process.StandardError;
            process.WaitForExit();
            success = (process.ExitCode == 0);

            //Display the result
            string displayText = string.Concat("Output", Environment.NewLine, "==============", Environment.NewLine);
            displayText = string.Concat(displayText, outputReader.ReadToEnd());
            displayText = string.Concat(displayText, Environment.NewLine, "Error", Environment.NewLine, "==============", Environment.NewLine;
            displayText += errorReader.ReadToEnd();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (outputReader != null)
        {
            outputReader.Close();
        }
        if (errorReader != null)
        {
            errorReader.Close();
        }
    }
}
if (success)
{
    // ... do something)
}
else
{
    // ... do something else
}