Russian Qt Forum

Qt => Общие вопросы => Тема начата: ZIkos от Декабрь 05, 2007, 11:28



Название: QProcess и tar
Отправлено: ZIkos от Декабрь 05, 2007, 11:28
В своей программе я архивирую данные tar архиватором, мне необходимо чтобы лог архивирования отображался в QTextEdit.
Код:
             m_pProcessTar = new QProcess();
   //Отслеживаем удачно ли запустился процесс архивации
   connect(m_pProcessTar, SIGNAL(error(QProcess::ProcessError)),
         this, SLOT(OnTarError(QProcess::ProcessError)));

   //Отображаем процесс архивации. Не работает!!!!!!!!!!!!!!!!!!!!!
   connect(m_pProcessTar, SIGNAL(readyReadStandardOutput()),
         this, SLOT(OnTarOutput()));
   connect(m_pProcessTar, SIGNAL(readyReadStandardError()),
      this, SLOT(OnTarOutput()));

   m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels);

   QString strArguments = tr("tar cfv с:\123.tar  c:\windows)
   m_pProcessTar->start(strArguments);
   m_pProcessTar->waitForFinished();
}

void CCreateDistribTree::OnTarError(QProcess::ProcessError error)
{
   if(error == QProcess::FailedToStart)
   {
      m_pCopyDialog->TarError();
   }
}

void CCreateDistribTree::OnTarOutput()
{
   QByteArray  strNewText = m_pProcessTar->readAllStandardOutput();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));

   strNewText = m_pProcessTar->readAllStandardError();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));
}

Выполняя архивацию в командной строке лог архивирования отображается, а когда выполняется мой код, то архивация проходит нормально, но никакого лога НЕТ, и даже программа не попадает в слот OnTarOutput.

Подскажите как с этим справиться?


Название: Re: QProcess и tar
Отправлено: Alex03 от Декабрь 05, 2007, 11:50
А убрать m_pProcessTar->waitForFinished(); ?


Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 05, 2007, 11:57
А убрать m_pProcessTar->waitForFinished(); ?


Не помогло.


Название: Re: QProcess и tar
Отправлено: Mikhail от Декабрь 05, 2007, 13:03
В своей программе я архивирую данные tar архиватором, мне необходимо чтобы лог архивирования отображался в QTextEdit.
Код:
             m_pProcessTar = new QProcess();
   //Отслеживаем удачно ли запустился процесс архивации
   connect(m_pProcessTar, SIGNAL(error(QProcess::ProcessError)),
         this, SLOT(OnTarError(QProcess::ProcessError)));

   //Отображаем процесс архивации. Не работает!!!!!!!!!!!!!!!!!!!!!
   connect(m_pProcessTar, SIGNAL(readyReadStandardOutput()),
         this, SLOT(OnTarOutput()));
   connect(m_pProcessTar, SIGNAL(readyReadStandardError()),
      this, SLOT(OnTarOutput()));

   m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels);

   QString strArguments = tr("tar cfv с:\123.tar  c:\windows)
   m_pProcessTar->start(strArguments);
   m_pProcessTar->waitForFinished();
}

void CCreateDistribTree::OnTarError(QProcess::ProcessError error)
{
   if(error == QProcess::FailedToStart)
   {
      m_pCopyDialog->TarError();
   }
}

void CCreateDistribTree::OnTarOutput()
{
   QByteArray  strNewText = m_pProcessTar->readAllStandardOutput();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));

   strNewText = m_pProcessTar->readAllStandardError();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));
}

Выполняя архивацию в командной строке лог архивирования отображается, а когда выполняется мой код, то архивация проходит нормально, но никакого лога НЕТ, и даже программа не попадает в слот OnTarOutput.

Подскажите как с этим справиться?


Попробуй убрать :
m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels);


Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 05, 2007, 13:10
Mikhail, убрал m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels); тоже не помогло.

У кого нибудь есть еще идеи?


Название: Re: QProcess и tar
Отправлено: Вячеслав от Декабрь 05, 2007, 14:47
IMHO tar cvf
f требует имя файла ,а ты ему че скармливаешь ? ;)
И man tar рулит ;)
PS я-б еще -j или -z добавил ж)


Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 05, 2007, 15:03
IMHO tar cvf
f требует имя файла ,а ты ему че скармливаешь ? ;)
И man tar рулит ;)
PS я-б еще -j или -z добавил ж)


f параметр для указания имени архива(без параметра f архив кладется на дискету).
j параметр для добавления комментариев, они мне не нужны
z параметр для сжатия, Мне хотябы пока без сжатия сделать, чтобы лог арихивирования прочитать

А что такое  man tar?


Название: Re: QProcess и tar
Отправлено: Alex03 от Декабрь 05, 2007, 15:34
Mikhail, убрал m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels); тоже не помогло.

У кого нибудь есть еще идеи?
Идеи....
1. Запускать не tar (мало ли, мож там анализ какойнить откуда запущен и нужен ли вывод), а чтото с гарантированным выводом типа
Код:
cmd /c echo string
или
Код:
cmd /c type file.txt
2. Упростить код, (написать тестовый примерчик)
3. огласить весь код. (в приведённом примере нет начала, есть ошибки...)



Название: Re: QProcess и tar
Отправлено: Mikhail от Декабрь 05, 2007, 15:50
По всему видно, что проблема проста как мир.

Как у тебя объявлено :
OnTarOutput()?
Скорее всего эта функция не объявлена слотом, поэтому нисего и не принимает.
Проверь!!!
 ЕСли объявлена как слот, то выложи для обозрения include для проверки.


Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 05, 2007, 15:53
Mikhail, убрал m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels); тоже не помогло.

У кого нибудь есть еще идеи?
Идеи....
1. Запускать не tar (мало ли, мож там анализ какойнить откуда запущен и нужен ли вывод), а чтото с гарантированным выводом типа
Код:
cmd /c echo string
или
Код:
cmd /c type file.txt
2. Упростить код, (написать тестовый примерчик)
3. огласить весь код. (в приведённом примере нет начала, есть ошибки...)




запустил процесс с аргументами cmd /c echo string12312312312312
Все работает.
А вот с таром не хочет дружить.


Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 05, 2007, 16:07
наконец то удалось получить лог!!!!!
процесс надо запускать таким образом.

m_tarProcess.start("cmd /c tar cfv c:\123.tar c:\windows");

Теперь остается вопрос. Это сработает по виндой, а как быть под линукс?


Название: Re: QProcess и tar
Отправлено: Вячеслав от Декабрь 05, 2007, 21:36
А тар-то у тебя какой кстати ?
Под пингвином в сторону [ba]sh смотреть ....
и ктати -j это работать через bzip2
А вообще http://www.opennet.ru/man.shtml?topic=tar&category=1&russian=2 (http://www.opennet.ru/man.shtml?topic=tar&category=1&russian=2)
И все-таки -f _требует аргумента_ правильнее ее пихать в данном случае последней иначе - возможны варианты ....


Название: Re: QProcess и tar
Отправлено: Alex03 от Декабрь 06, 2007, 07:18
m_tarProcess.start("cmd /c tar cfv c:\123.tar c:\windows");

да и в исходной
QString strArguments = tr("tar cfv с:\123.tar  c:\windows)

Надеюсь в коде обратные слеши заэкранированны?



Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 06, 2007, 19:50
m_tarProcess.start("cmd /c tar cfv c:\123.tar c:\windows");

да и в исходной
QString strArguments = tr("tar cfv с:\123.tar  c:\windows)

Надеюсь в коде обратные слеши заэкранированны?



заэкранированы. этот код приводил для примера, так что не уследил


Название: Re: QProcess и tar
Отправлено: ZIkos от Декабрь 07, 2007, 11:44
Кинитье пожалуйста сссылочку где можно скачать tar архиватор, который жмет в  bz2.


Название: Re: QProcess и tar
Отправлено: ритт от Декабрь 07, 2007, 17:49
ппц
ftp.gnu.org/gnu/tar/
ftp.gnu.org/gnu/bzip2/
ссылку на мингв дать? а ещё могу на гнувин ссылку дать!

/* охренела молодёжь */