0

わかりました、Tail を使用してログ ファイルを監視しようとしていますが、同じパラメーターを使用して cmd プロンプトから手動で実行した場合と同じ動作をプログラムで取得できません。

cmd プロンプトを実行すると、新しい行が即座に表示されます。ただし、プログラム的には、「バッファ」がすべての行を解き放つ前に、ログ ファイルに約 75 行以上の新しい行が追加されるのを待つ必要があります。

ここに私が今持っているコードがあります。

private const string tailExecutable = @"C:\tail.exe";
private const string logFile = @"C:\test.log";

private static void ReadStdOut()
{
    var psi = new ProcessStartInfo
    {
        FileName = tailExecutable,
        Arguments = String.Format("-f \"{0}\"", logFile),
        UseShellExecute = false,
        RedirectStandardOutput = true
    };

    // Running same exe -args through cmd.exe 
    // works perfectly, but not programmatically.
    Console.WriteLine("{0} {1}", psi.FileName, psi.Arguments);

    var tail = new Process();
    tail.StartInfo = psi;
    tail.OutputDataReceived += tail_OutputDataReceived;
    tail.Start();
    tail.BeginOutputReadLine();
}

static void tail_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data);
}

以前に OutputDataReceived イベントを使用したことがありますが、これらのバッファリングやスパムの問題は一度もありませんでした。

私は今、とても混乱しています。

*編集*

CodeProject でこの wintail プロジェクトを見つけましたが、バッファによってこのソリューションが遅くなりすぎるため、それに切り替える予定です。

答えてくれてありがとう。

4

2 に答える 2

3

Process.StandardOutputは、リダイレクトされると、デフォルトで4096バイトのバッファーを備えたStreamReaderに設定されるため、答えは「はい」です。

于 2008-10-26T12:30:28.437 に答える
1

ほとんどの言語とオペレーティングシステムでは、通常、標準ストリームはバッファリングされますが、エラーストリームはバッファリングされません。

使用してみてください: System.Console.Error

于 2008-10-26T12:27:48.880 に答える