2

マシンで現在開いているドキュメントを表示する出力を取得しようとしていますが、何があっても NULL が返されます。

StringCollection values = new StringCollection();
var proc = new Process
{
     StartInfo = new ProcessStartInfo
     {
          FileName = "openfiles.exe",
          Arguments = "/query /FO CSV /v",
          UseShellExecute = false,
          RedirectStandardOutput = true,
          CreateNoWindow = true
     }
};
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
     string line = proc.StandardOutput.ReadLine();
     values.Add(line);
}
foreach (string sline in values)
MessageBox.Show(sline);

編集:

詳細なレビュー中に、例外の問題が発生していることがわかります。diag の実行中に次のメッセージが表示されます: Proc.BasePriority thre an exception of type System.InvalidOperationException

編集:

次のようにコードをプルしようとしました:

string val = proc.StandardOutput.ReadToEnd();
MessageBox.Show(val);

また、戻り時に NULL 値が返され、proc.start(); の後でも Proc でエラーが発生していました。

4

1 に答える 1

10

標準出力ストリームと標準エラー ストリームの両方を読み取る必要があります。これは、同じスレッドから両方を読み取ることができないためです。

これを実現するには、別のスレッドで呼び出されるイベント ハンドラを使用する必要があります。

32 ビットおよび 64 ビットのバリアントに付属するanycpuようにコードをコンパイルします。openfilesアーキテクチャの不一致がある場合、実行可能ファイルが見つからない可能性があります。

エラー ストリームから読み取られる行には、先頭に ! が付加されます。>出力で目立つようにします。

    StringCollection values = new StringCollection();
    var proc = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "openfiles.exe",
            Arguments = "/query /FO CSV /v",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = false
        }
    };
    proc.Start();

    proc.OutputDataReceived += (s,e) => {
        lock (values)
        {
            values.Add(e.Data);
        }
    };
    proc.ErrorDataReceived += (s,e) => {
        lock (values)
        {
            values.Add("! > " + e.Data);
        }
    };

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
    foreach (string sline in values)
        MessageBox.Show(sline);
于 2013-02-22T20:51:52.993 に答える