繁体   English   中英

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

[英]How to use C# Stream Reader to save a completion of a process?

我有一个程序,它使用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提交?

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();  
   }   
 }
}

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

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

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

在您的示例中, 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

2589

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

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

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

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();  
   }   
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM