Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StandardOutput, Как правильно считывать строки с консоли 
V
    Опции темы
Incvizitor
Дата 28.5.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Здравствуйте форумчане,

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


Код

            string log = cmd.StandardOutput.ReadToEnd();

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


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

Код

string log = cmd.StandardOutput.ReadLine();


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


Это сообщение отредактировал(а) Incvizitor - 28.5.2009, 08:13
PM MAIL   Вверх
Vilandrew
Дата 28.5.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.6.2006
Где: Казань

Репутация: нет
Всего: нет



Может так?
Код

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


Это сообщение отредактировал(а) Vilandrew - 28.5.2009, 10:02
PM MAIL WWW ICQ Jabber   Вверх
Лен
Дата 28.5.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



.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() и т.п.
PM MAIL   Вверх
Incvizitor
Дата 28.5.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



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

Код

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


Спасибо!
PM MAIL   Вверх
Incvizitor
Дата 3.7.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Приветствую,

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

Код

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


В другом потоке, то есть отдельно от Process.Start() ? Если да, то поделитесь кодом.
Спасибо!
PM MAIL   Вверх
Incvizitor
Дата 4.7.2009, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Вопрос снят, разобрался, оказывается для асинхронной работы нужен был OutputDataReceived, всем спасибо за внимание.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.