Как использовать C # Stream Reader для сохранения завершения процесса? - PullRequest
1 голос
/ 16 ноября 2010

У меня есть программа, которая использует программу CMD для выполнения различных аргументов.

Аргументами, которые будут работать в обычной CMD, будет C: \ temp \ bin \ fls.exe -m C: -rC: \ 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.bodyfile.

Я читал много других веб-сайтов ивсе они указывают на проблему отсутствия в моей программе потокового считывателя для сохранения завершения процесса в файл.Так может кто-нибудь посоветовать, пожалуйста, мою программу, чтобы процесс был сохранен в файл?Спасибо!

Один такой похожий веб-сайт с такой же проблемой: 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 ]

2 голосов
/ 16 ноября 2010

Это оболочка, которая выполняет перенаправление, так что часть вашего списка аргументов передается прямо в fls. Вы должны удалить его.

Вы можете читать напрямую из стандартного out и error и сохранять данные таким образом - или вы можете вызвать cmd и дать ему все аргументы, чтобы он перенаправил вывод.

Обратите внимание, что если вы делаете , используете стандартный вывод и стандартную ошибку, вам, вероятно, следует прочитать один из них из другого потока - или не перенаправлять его. В настоящее время, если процесс записывает много данных в стандартную ошибку, вы не читаете их, и в конечном итоге он исчерпает буферное пространство и блокируется.

1 голос
/ 06 мая 2011

2589

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

очевидно, что решение проблемы поля в классе объекта

1 голос
/ 16 ноября 2010

В вашем примере вывод 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 из аргументов.

0 голосов
/ 16 ноября 2010

Ваши ответы очень разнообразны, но я наконец нашел ответ на вопрос.

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();  
   }   
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...