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 之间的区别