日期:2014-05-18  浏览次数:20931 次

StreamReader读取dos命令行的输出流的问题
有如下代码(主要部分)

Process p=new Process();
p.StartInfo.FileName=@"c:\windows\system32\cmd.exe";
p.StartInfo.RedirectStandardError=true;
p.StartInfo.RedirectStandardInput=true;
p.StartInfo.RedirectStandardOutput=true;
p.StartInfo.UseShellExecute=false;
p.Start();

p.StandardInput.WriteLine("dir c:\\");
string str=p.StandardOutput.ReadToEnd();//问题所在

Console.WriteLine(str);

问题在于执行到p.StandardOutput.ReadToEnd();时候就一直阻塞,调试发现的确读完了命令行输出数据,但可能是缺少流结束符所以无法结束Read;如果使用StandardOutput.ReadLine()无法知道读到哪行才读完本次的输出数据。问有什么方法可以既读完dir c:\\的输出,又能使ReadToEnd();及时返回?

------解决方案--------------------
C# code
  if (p.HasExited)
            {                
                //从输出流获取执行结果 
                strRst = p.StandardOutput.ReadToEnd();
            }

------解决方案--------------------
C# code
static void Main(string[] args)
        {
            Process ps = new Process();
            ps.StartInfo.FileName = "cmd.exe";
            ps.StartInfo.RedirectStandardOutput = true;
            ps.StartInfo.RedirectStandardInput = true;
            ps.StartInfo.CreateNoWindow = true;
            ps.StartInfo.UseShellExecute = false;
            ps.StartInfo.StandardOutputEncoding = System.Text.Encoding.Default;
            ps.StartInfo.RedirectStandardError = false;
            ps.OutputDataReceived += new DataReceivedEventHandler(ps_OutputDataReceived);

            ps.Start();
            ps.BeginOutputReadLine();
            ps.StandardInput.WriteLine(@"dir c:\");
            ps.StandardInput.Close();
            ps.WaitForExit();
            ps.Close();
        }
        static void ps_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data == null)
            {
                return;
            }
            Console.Write(e.Data+"\n");
        }

------解决方案--------------------
探讨
p.StandardInput.WriteLine("exit");