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 回答