Почему C # ProcessStartInfoRedirectStandardOutput может вызвать сбой процесса xcopy - PullRequest
8 голосов
/ 20 февраля 2009

Это немного больно, потому что у меня сейчас нет кода передо мной, но я попытаюсь объяснить.

У меня есть простое приложение на C #, которое запускает скрипт Ruby (он выполняет несколько других действий, поэтому он генерирует пакетный файл и выполняет его).

Я использую объект процесса C # и установил следующее redirectstandardoutput = true redirectstandarderror = true UseShellExecute = false CreateNoWindow = true (прекрасная часть обратной логики!)

Затем я создаю два потока и опрашиваю ReadLine () как для потока ошибок, так и для потоков вывода, ожидая их завершения, прежде чем я вызову WaitForExit ().

Теперь, независимо от того, что я делаю, мой скрипт Ruby не может вызвать системную ("xcopy ...") команду, когда я перенаправляю вывод (никаких ошибок не генерируется, он просто не копирует). Он также не копирует другие файлы, которые я прошу скопировать.

Это происходит, если я направляю оба потока в поток, один из них, перенаправляю только один из них и просто вызываю ReadToEnd ().

Это работает правильно, только если я установил redirectstandardoutput и redirectstandarderror в false.

Я в полной растерянности. Я подумал, что, возможно, поток вывода был заполнен, но я не представляю, почему, если я вызываю ReadLine (мне нужна строка чтения, чтобы я мог анализировать каждую строку и представлять только соответствующие конечному пользователю). Я также подумал, что, возможно, вызов команд dos из многопоточного процесса C # может вызвать проблемы.

Кто-нибудь знает, что здесь может происходить? Я должен сказать, что я нахожусь на VS .net 2005, который я считаю .Net Framework 2.0.

1 Ответ

9 голосов
/ 20 февраля 2009

На форумах MSDN есть неясная публикация , которая, по-видимому, указывает на то, что с XCOPY может быть сбой - если вы перенаправляете STDOUT XCOPY, вы также должны перенаправить STDIN.

( примечание: я отмечаю это вики сообщества, поэтому кто-то, кто знает ruby, может написать пример кода для перенаправления STDIN для system () )

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