Перенаправить двоичные данные из Process.StandardOutput вызывает искажения данных - PullRequest
2 голосов
/ 24 января 2012

На вершине это проблема, у меня есть другая.Я пытаюсь получить двоичные данные из внешнего процесса, но данные (изображение), кажется, повреждены.На приведенном ниже снимке экрана показано повреждение: левое изображение было выполнено при запуске программы из командной строки, правое - из кода.enter image description here

Мой код на данный момент:

var process = new Process
{
  StartInfo =
  {
    Arguments = string.Format(@"-display"),
    FileName = configuration.PathToExternalSift,
    RedirectStandardError = true,
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true,
  },
  EnableRaisingEvents = true
};

process.ErrorDataReceived += (ProcessErrorDataReceived);

process.Start();
process.BeginErrorReadLine();

//Reads in pbm file.
using (var streamReader = new StreamReader(configuration.Source))
{
  process.StandardInput.Write(streamReader.ReadToEnd());
  process.StandardInput.Flush();
  process.StandardInput.Close();
}
//redirect output to file.
using (var fileStream = new FileStream(configuration.Destination, FileMode.OpenOrCreate))
{
  process.StandardOutput.BaseStream.CopyTo(fileStream);
}

process.WaitForExit();

Это какая-то проблема кодирования?Я использовал Stream.CopyTo-подход, как упомянуто здесь , чтобы избежать проблем.

1 Ответ

5 голосов
/ 25 января 2012

Я нашел проблему.Перенаправление вывода было правильным, кажется, что чтение входного сигнала является проблемой.Поэтому я изменил код с:

using (var streamReader = new StreamReader(configuration.Source))
{
  process.StandardInput.Write(streamReader.ReadToEnd());
  process.StandardInput.Flush();
  process.StandardInput.Close();
}

на

using (var fileStream = new StreamReader(configuration.Source))
{
  fileStream.BaseStream.CopyTo(process.StandardInput.BaseStream);
  process.StandardInput.Close();
}

Не работает!

Для всех людей, которые могут иметь ту же проблему, здесь исправленокод:

var process = new Process
{
  StartInfo =
  {
    Arguments = string.Format(@"-display"),
    FileName = configuration.PathToExternalSift,
    RedirectStandardError = true,
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true,
  },
  EnableRaisingEvents = true
};

process.ErrorDataReceived += (ProcessErrorDataReceived);

process.Start();
process.BeginErrorReadLine();

//read in the file.
using (var fileStream = new StreamReader(configuration.Source))
{
    fileStream.BaseStream.CopyTo(process.StandardInput.BaseStream);
    process.StandardInput.Close();
}
//redirect output to file.
using (var fileStream = new FileStream(configuration.Destination, FileMode.OpenOrCreate))
{
    process.StandardOutput.BaseStream.CopyTo(fileStream);
}

process.WaitForExit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...