如何使用C#Stream Reader保存进程的完成?

时间:2010-11-16 05:59:06

标签: c# file process streamreader

我有一个使用CMD程序执行各种争论的程序。

在普通CMD中起作用的争论将是C:\ temp \ bin \ fls.exe -m C:-r C:\ temp \ image.dd> C:\ temp \ bin \ ntfs.bodyfile。

我编写的C#程序只能工作到C:\ temp \ bin \ fls.exe -m C:-r C:\ temp \ image.dd但不执行> C:\ temp \ bin \ ntfs.bodyfile表示将进程保存到ntfs.body文件中。

我已阅读过很多其他网站,他们都指出我的程序错过了一个流程读取器以将流程完成保存到文件中的问题。那么有人可以建议我的程序将进程保存到文件中吗?谢谢!

具有相同问题的一个类似网站将是:StreamReader to file?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Diagnostics;

namespace ConsoleApplication1
{
class Program
{
   static void Main(string[] args)
   {
       Process process = new Process();
       process.StartInfo.FileName = "C:\\temp\\bin\\fls.exe";
       process.StartInfo.Arguments = "-m C: -r C:\\temp\\image.dd > 
       C:\\temp\\bin\\ntfs.bodyfile";
       process.StartInfo.UseShellExecute = false;
       process.StartInfo.RedirectStandardOutput = true;
       process.StartInfo.RedirectStandardInput = true;
       process.StartInfo.RedirectStandardError = true;
       process.Start();

       System.IO.StreamReader reader = process.StandardOutput;
       string sRes = reader.ReadToEnd();
       Console.WriteLine(sRes);
       reader.Close();  
   }   
 }
}

4 个答案:

答案 0 :(得分:2)

它是执行重定向的shell,因此您的参数列表的一部分将被直接传递给fls。你应该删除它。

可以直接从标准输出和错误中读取,并以这种方式保存数据 - 或者您可以调用cmd并为其提供所有参数以使其重定向输出。

请注意,如果您执行使用标准输出和标准错误,您可能应该从其他线程中读取其中一个 - 或者不重定向它。目前,如果进程将大量数据写入标准错误,则不会读取它,并且最终会耗尽缓冲区空间并阻塞。

答案 1 :(得分:1)

在您的示例中,fls.exe的输出应显示在ntfs.bodyfile中,因为您要将fls.exe的输出重定向到该文件。

由于您要将fls.exe的输出重定向到该文件,因此sRes应保持为空。

有一些问题。首先,您不要等待进程退出。如果上述程序是您的完整程序,这应该不是问题。但是,如果要读取ntfs.bodyfile的输出,则应等待进程退出。请尝试以下方法:

using (Process process = new Process())
{
    process.StartInfo.FileName = "C:\\temp\\bin\\fls.exe";
    process.StartInfo.Arguments = "-m C: -r C:\\temp\\image.dd > C:\\temp\\bin\\ntfs.bodyfile";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardError = true;
    process.Start();

    using (System.IO.StreamReader reader = process.StandardOutput)
    {
        string sRes = reader.ReadToEnd();
        Console.WriteLine(sRes);
        reader.Close();
        process.WaitForExit();
    }
}

这将确保清除Process,等待fls.exe完成并正确关闭StreamReader

现在关于产量。有两种选择。如果您希望输出显示在ntfs.bodyfile中,则应设置。但是,如果您希望输出显示在sRes中,则应从参数中删除> C:\\temp\\bin\\ntfs.bodyfile

答案 2 :(得分:1)

2589

   SW.WriteLine(sRes);
   SW.Close();
   Console.WriteLine("File Created SucacessFully");
   reader.Close();  

显然,解决方案是对象类中的字段问题

答案 3 :(得分:0)

你的答案各不相同,但我终于找到了问题的答案。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication1
{
 class Program
 {
   static void Main(string[] args)
   {
       Process process = new Process();
       process.StartInfo.FileName = "C:\\temp\\bin\\fls.exe";
       process.StartInfo.Arguments = "-m C: -r C:\\temp\\image.dd";
       process.StartInfo.UseShellExecute = false;
       process.StartInfo.RedirectStandardOutput = true;
       process.StartInfo.RedirectStandardInput = true;
       process.StartInfo.RedirectStandardError = true;
       process.Start();

       System.IO.StreamReader reader = process.StandardOutput;
       string sRes = reader.ReadToEnd();
       StreamWriter SW;
       SW = File.CreateText("C:\\temp\\ntfs.bodyfile");
       SW.WriteLine(sRes);
       SW.Close();
       Console.WriteLine("File Created SucacessFully");
       reader.Close();  
   }   
  }
}