3

ProcessStartInfoとを使用してProcess、プログラム(getdiff.exeなど)を起動し、プログラムが生成するすべての出力を読み取ります。後で、データをより建設的な方法で使用します。データが機能することを確認するために、データを印刷したいだけです。ただし、プログラムは正常に終了しません。誰かがなぜそうするのですか?よろしくお願いします。

ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe");
psi.Arguments = "DIFF";
psi.UseShellExecute = false;                
psi.RedirectStandardInput = true;
psi.WorkingDirectory = "c:\\test";

Process p = Process.Start(psi);
string read = p.StandardOutput.ReadToEnd();
p.WaitForExit();

Console.WriteLine(p);
Console.WriteLine("Complete");

p.Close();

プログラムをこれに変更すると、正しく機能するようになりました。

ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe");
psi.Arguments = "DIFF";
psi.UseShellExecute = false;                
psi.RedirectStandardInput = true;
psi.WorkingDirectory = "c:\\test";

Process p = Process.Start(psi);
StreamReader read = p.StandardOutput;

while (read.Peek() >= 0)
    Console.WriteLine(read.ReadLine());

Console.WriteLine("Complete");
p.WaitForExit();
p.Close();
4

4 に答える 4

3

MSDNは、プロセスの入力/出力をリダイレクトする方法の良い例を提供します。ReadToEnd()ストリームの終わりを正しく判別できません。MSDNによると:

ReadToEndは、ストリームがいつ終了したかを知っていると想定します。サーバーがデータを要求したときにのみデータを送信し、接続を閉じないインタラクティブプロトコルの場合、ReadToEndは無期限にブロックされる可能性があるため、回避する必要があります。

編集: 避けるべきもう1つの理由ReadToEnd():プログラムがデータを出力する前にストリームをリダイレクトする必要があるため、非常に高速なプロセスでは例外が発生します。

于 2011-06-21T11:38:18.307 に答える
3
ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe");
psi.Arguments = "DIFF";
psi.UseShellExecute = false;                
psi.RedirectStandardInput = true;
psi.WorkingDirectory = "c:\\test";

Process p = Process.Start(psi);
StreamReader read = p.StandardOutput;

while (read.Peek() >= 0)
    Console.WriteLine(read.ReadLine());

Console.WriteLine("Complete");
p.WaitForExit();
p.Close();
于 2011-06-21T19:52:47.640 に答える
1

それが関連しているかどうかはわかりませんがpsi.RedirectStandardInput = true;、結果のストリームに対して何もせずに行います。たぶん、どういうわけか、アプリケーションは、入力ストリームが終了する前に「閉じられる」ことを要求しますか?だから試してみてくださいmyProcess.StandardInput.Close()

于 2011-06-21T11:36:26.047 に答える
-1

代わりにこのコードを試してください、

p.CloseMainWindow()

于 2011-06-21T11:41:21.050 に答える