StreamReader.ReadToEnd() 返回空字符串 [重复]

Posted

技术标签:

【中文标题】StreamReader.ReadToEnd() 返回空字符串 [重复]【英文标题】:StreamReader.ReadToEnd() returns empty string [duplicate] 【发布时间】:2018-09-27 20:44:20 【问题描述】:

我正在尝试在 cmd.exe 中运行命令,并将输出重定向到文本文件。我已经验证该命令正在执行,但是当我调用 StandardOutput.ReadToEnd() 或 StandardError.ReadToEnd() 时,将返回一个空字符串而不是命令的文本输出。我错过了什么吗?

    ProcessStartInfo PSI = new ProcessStartInfo("cmd.exe", command);

    PSI.UseShellExecute = false;
    PSI.CreateNoWindow = true;
    PSI.RedirectStandardInput = true;
    PSI.RedirectStandardOutput = true;
    PSI.RedirectStandardError = true;
    PSI.Arguments = "/c";

    var proc = Process.Start(PSI);
    proc.WaitForExit();

    string output = proc.StandardOutput.ReadToEnd();
    Console.WriteLine(output);

    string errors = proc.StandardError.ReadToEnd();
    Console.WriteLine(errors);

【问题讨论】:

我正要发布答案,但不幸的是,它因无效的主要原因而关闭。构造函数中指定的参数被Arguments 属性覆盖。所以你实际调用的是cmd.exe /c 而不是cmd.exe command,它不会输出任何东西。参考:github.com/Microsoft/referencesource/blob/master/System/… 和 github.com/Microsoft/referencesource/blob/master/System/… 【参考方案1】:

如果您同时捕获错误输出,我很确定使用ReadToEnd 不起作用。您需要使用 proc.BeginOutputReadLine() 代替(和 proc.BeginErrorReadLine() 用于错误输出)。

但是,这些方法是异步的,因此您需要使用事件处理程序来实际获取输出。

PSI.EnableRaisingEvents = true;
proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(OutputReceivedHandler);
proc.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(ErrorReceivedHandler);

处理程序将输出/错误数据存储在事件参数的Data 属性中。

private void OutputReceivedHandler(object sender, DataReceivedEventArgs e)

    Console.WriteLine(e.Data);


private void ErrorReceivedHandler(object sender, ErrorReceivedEventArgs e)

    Console.WriteLine(e.Data);

由于这都是异步的,因此您需要放弃 WaitForExit 调用,因为这会不必要地阻塞。如果您确实想要阻止调用,您可以使用WaitForExit,但请参阅the answer that user Greg linked in the comments 以获得不会导致缓冲区溢出的实现。

【讨论】:

这个问题对于谈到上述内容的他来说可能是一个可靠的参考。 ***.com/questions/139593/… @Greg 然后将问题标记为重复,而不是发布糟糕的答案 @Eser 我在慢动作,大脑间隔开。 @pushasha 当然执行一个进程并读取输出已经被回答了数百万次。 "asinus asinum fricat" @pushasha BTW:我赞成你的回答

以上是关于StreamReader.ReadToEnd() 返回空字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

reader.ReadToEnd 和 Stream.Read 之间的区别

解析来自 StreamBuilder C# 的 JSON 响应

双向命名管道问题

Unity 读取Json常用的两种方式

如何使用C#MVC呈现JSON文件

一种消耗(所有字节)BinaryReader 的优雅方式?