Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > StandardOutput


Автор: Incvizitor 28.5.2009, 08:11
Здравствуйте форумчане,

Столкнулся с проблемой считывания с консоли, вот код который записывает вывод:


Код

            string log = cmd.StandardOutput.ReadToEnd();

            using (StreamWriter sw = File.CreateText("cmd.log"))
            {
                sw.Write(log);
            }


Он все записывает, но только когда консольное приложение уже выполнит всю свою работу. Пробовал измени на:

Код

string log = cmd.StandardOutput.ReadLine();


Но так записывает только одну (первую) строчку, а хотелось бы построчно. Если кому несложно, поделитесь примером как нужно правильно, построчно записывать. Спасибо. smile

Автор: Vilandrew 28.5.2009, 09:45
Может так?
Код

static void Main(string[] args)
        {
            CreateLog("1");
            CreateLog("2");
            CreateLog("3");
        }

        static void CreateLog(string text)
        {
                StreamWriter sw = new StreamWriter(@"C:\test.txt", true, Encoding.GetEncoding(1251));
                sw.WriteLine(text);
                sw.Close();
        }

Автор: Лен 28.5.2009, 11:34
.ReadToEnd() в потоке считывает его содержимое до конца (закрытия), а .ReadLine() - только в одну строку. В этом суть методов. Я бы на вашем месте определил какой-либо символ/команду/строку-терминатор, прекращающий ввод и написал так:
Код

using (StreamWriter sw = File.CreateText("cmd.log"))
{
  while (true)
  {
    string log = cmd.StandardOutput.ReadLine();
    if (log == TEMINATE_COMMAND)
      break;
    sw.Write(log);
  }
}

Вместо log в проверке лучше использовать log.ToUpper().Trim() и т.п.

Автор: Incvizitor 28.5.2009, 16:27
Спасибо ребята, я еще вчера с while сделал, но все равно криво получилось. Воспользовался примером Лен, как бы пишет. Хотелось бы спросить, а вот строка-терминатор (сори, впервые услышал), здесь нужно указать строку, которая пишется самой последней? И если скажем с конце пишется Process Stop - Time: [и_какое_то_время], то можно указать просто?:

Код

if(log.ToUpper().Trim() == "Process Stop - Time:")
    break;


Спасибо!

Автор: Incvizitor 3.7.2009, 18:07
Приветствую,

Вернусь к старому, так как не хочет оно работать так как нужно. Существует ли возможность выполнять код:

Код

            string log = cmd.StandardOutput.ReadToEnd();
            using (StreamWriter sw = File.CreateText("cmd.log"))
            {
                sw.Write(log);
            }


В другом потоке, то есть отдельно от Process.Start() ? Если да, то поделитесь кодом.
Спасибо!

Автор: Incvizitor 4.7.2009, 01:18
Вопрос снят, разобрался, оказывается для асинхронной работы нужен был OutputDataReceived, всем спасибо за внимание.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)