Russian Qt Forum

Qt => Общие вопросы => Тема начата: ysfox от Сентября 02, 2010, 11:43



Название: QT и Архивы
Отправлено: ysfox от Сентября 02, 2010, 11:43
Добрый день всем
Возник вопрос по архивам. думаю много кому тоже пригодится.
Суть вопроса мроста: с помощю командной строки считываю с флешки архив, потом ево разархивовываю и запускаю в нем бат файл который делаэт уже сам все дальше
Код:
system("cp -R /media/sda1/imya.zip /home/root");
system("unzip imya.zip /home/root");
system( "imya.bat");

если так делать то архив ещо не успел считатся как уже разархивовывается и запускается бат :(
как проверить разархивовался и считался архив или нет и возникли при етом ошыбки или нет?

Был бы очень благодерен за Ваш совет :)

ПС: есть одно решение но оно мне не подхлдит запускать из програмы бат файл а уже в нем чтоб были прописаны строки разархивовывания и запуска... такой вариант точно работает - но ето не вариант)... так как мне нужно считать 1н файл с флешки потом ево разпаковать и дальше делать с ним уже все что надо :)... но вот как проверить все ли зделано и разпаковано никак не найду...


Название: Re: QT и Архивы
Отправлено: Авварон от Сентября 02, 2010, 11:47
QProcess


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 02, 2010, 11:49
QProcess

пробовал не катит :), никак не могу к нему прицепить сигнал завершения и как обработать удачно или нет?
может у Вас есть нормальный пример?


Название: Re: QT и Архивы
Отправлено: BRE от Сентября 02, 2010, 11:53
Попробуй так:
Код:
system("cp -R /media/sda1/imya.zip /home/root && unzip imya.zip /home/root && imya.bat");

или сделай еще один скрипт выполняющий все эти операции и запускай уже его.


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 02, 2010, 11:56
Пасиб :)
щас попробую етот вариант и отпишусь - было б очень хорошо если б сработал)))


Название: Re: QT и Архивы
Отправлено: merke от Сентября 02, 2010, 12:09
Сделал значит так: ты наверняка знаешь что у тебя хранится в архиве т.е. количество файлов и их имена. После распаковки входи в цикл, используй QDir::entryList() в цикле чтобы получать все содержимое той папки куда разархивируешь. Как только список будет валидным, т.е. весь заполнится по шаблону ты выходишь из цикла и запускаешь батник.


Название: Re: QT и Архивы
Отправлено: merke от Сентября 02, 2010, 12:12
Пример использования QDir

Код:
#include <QDir>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QDir dir;
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Size | QDir::Reversed);

    QFileInfoList list = dir.entryInfoList();
    std::cout << "     Bytes Filename" << std::endl;
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
                                                .arg(fileInfo.fileName()));
        std::cout << std::endl;
    }
    return 0;
}


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 02, 2010, 12:26
BRE пасиб - сработало!!!! пасиб запускается все как надо :)... выходит такой вариант записи работает как бат - запускает все по очереди и только когда закончился предыдущий процес а ето какраз то что мне надо :)
но ето так черновой вариант?, тут я не смогу обработать ошыбки (если фаил не открился не скачался и так далее)... хотя тут уже можно подключить кюпроцес и смотреть что выкинуло в терминалку :), есть над чем подумать :)

Александр Ваш вариант щас ещо попробую :)


Название: Re: QT и Архивы
Отправлено: Denjs от Сентября 02, 2010, 13:42
Ещё можно перехватывать потоки ввода-вывода и мониторить их на предмет нужных сообщений.
если надо - где-то я уже приводил как это делать....


Название: Re: QT и Архивы
Отправлено: SASA от Сентября 05, 2010, 13:41
Напишите вирус, который встроиться в систему. Он будет выдавать логи по всем событиям системы. Отфильтруйте только, те которые говорят о завершении процесса. Першлите получившейся лог на сервер в Австралии. Сервер обработает лог, и скажет что случилось.
З.С. Пред пересылкой не забудте зашифровать лог.


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 06, 2010, 10:02
Напишите вирус, который встроиться в систему. Он будет выдавать логи по всем событиям системы. Отфильтруйте только, те которые говорят о завершении процесса. Першлите получившейся лог на сервер в Австралии. Сервер обработает лог, и скажет что случилось.
З.С. Пред пересылкой не забудте зашифровать лог.

в линуксе вирусы не работают  ;D... ну по крайней мере здесь писать их неумею, да и не вижу смысла в таком процесе)))...
Все ето без проблем можно контролировать QProcess ом, но пока не разобрался как  ;)... Я им както запускал процесы но както каряво))), так и не разобрался что к чему :)


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 06, 2010, 10:04
Ещё можно перехватывать потоки ввода-вывода и мониторить их на предмет нужных сообщений.
если надо - где-то я уже приводил как это делать....

Ето выход из проблемы... но пока не встречал как ето делать... был бы очень благодарен если сможеш скинуть пример :)


Название: Re: QT и Архивы
Отправлено: TheMixa от Сентября 06, 2010, 10:46
QProcess::execute()
QProcess::readAllStandardError ()
QProcess::readAllStandardOutput ()


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 06, 2010, 11:31
QProcess::execute()
QProcess::readAllStandardError ()
QProcess::readAllStandardOutput ()


я делал так:
Код:
                       QProcess *proc = new QProcess();
                            proc->start(File_Name);
                            if (proc->Starting)
                              {
                                  proc->setProcessChannelMode( QProcess::MergedChannels );
                                  proc->setReadChannel(QProcess::StandardError);
                                  if (proc->Running) { proc->waitForReadyRead(30000);};
                              };
                            proc->close();
                            delete proc;
и если запутить таких 3 процеса подряд один за одним тогда 1й запускается, он ещо в работе а уже запустился 2й и так дальше - они не ждут завершения предыдущего процеса...
думаю что тоже самое будет и с вашым кодом, хотя не уверен... щас попробую :)


Название: Re: QT и Архивы
Отправлено: TheMixa от Сентября 06, 2010, 11:44
Цитировать
int QProcess::execute ( const QString & program, const QStringList & arguments )   [static]
Starts the program program with the arguments arguments in a new process, waits for it to finish, and then returns the exit code of the process. Any data the new process writes to the console is forwarded to the calling process.

The environment and working directory are inherited by the calling process.

On Windows, arguments that contain spaces are wrapped in quotes.


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 06, 2010, 12:25
о пасиб... значит всетаки ждет окончяния процеса а потом приступает к другому - если я правильно понял....

сделал пока што так:
Код:
                  QProcess *proc = new QProcess();
                  QString Error_string, Standart_output_string,aaalll_string;
                  File_Name = "cp -R /media/sda1/" + (Update_strukt[sss].name) + "_2.zip /home/root";
                  proc->execute(File_Name);
                  Error_string = proc->readAllStandardError();
                  Standart_output_string = proc->readAllStandardOutput();
                  aaalll_string = Error_string + "\n\n" + Standart_output_string;
                  proc->close();

                  File_Name = "unzip " + (Update_strukt[sss].name) + "_2.zip";
                  proc->execute(File_Name);
                  Error_string = proc->readAllStandardError();
                  Standart_output_string = proc->readAllStandardOutput();
                  aaalll_string += "\n\n" + Error_string + "\n\n" + Standart_output_string;
                  proc->close();

                  File_Name = (Update_strukt[sss].name) + ".bat";
                  proc->execute(File_Name);
                  Error_string = proc->readAllStandardError();
                  Standart_output_string = proc->readAllStandardOutput();
                  aaalll_string +=  "\n\n" + Error_string + "\n\n" + Standart_output_string;
                  proc->close();

                  proc->kill();
                  delete proc;
                  write_file("REZ.txt",aaalll_string);
но програмка зависает то на запуске бат файла то на разпаковке архива. где у меня ошыбка в коде?.... с процесами я пока ещо на ВЫ такшто нужна помощь :)


Название: Re: QT и Архивы
Отправлено: TheMixa от Сентября 06, 2010, 14:07
что зачит зависает? Думайте, смотрите внимательно стандартный вывод по ходу выполнения. Тут уже никто не поможет кроме как сам себе.


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 06, 2010, 14:36
ух разобрался... немного не так бат файл считывал :)
теперь все работает... но пока почемуто не выдает ничево в:
readAllStandardOutput();
readAllStandardError();

или там когда все пройшло успешно ничево не должно быть?



Название: Re: QT и Архивы
Отправлено: SASA от Сентября 06, 2010, 17:33
Все ето без проблем можно контролировать QProcess ом
Это я и хотел сказать.


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 07, 2010, 09:36
Все ето без проблем можно контролировать QProcess ом
Это я и хотел сказать.

 :)

но вот никак не пойму почему при считывание ошыбок и всево другого после завершения процеса - там пусто :(
сделал так:

Код:
                  QProcess *proc = new QProcess();
                  QByteArray Error_string, Standart_output_string, all;
                  QString aaalll_string;
                  File_Name = "/media/sda1/" + (Update_strukt[sss].name) + "_2.zip";
                  proc->execute("cp",QStringList() << "-R" << File_Name << "/home/root");
                  Error_string = proc->readAllStandardError();
                  Standart_output_string = proc->readAllStandardOutput();
                  all = proc->readAll();
                  aaalll_string = "\nPRINT:\n"+all+"\n\n"+Error_string+"\n\n"+Standart_output_string+"\nEND_PRINT\n";
                  qDebug(aaalll_string.toStdString().c_str());
                  proc->close();



но в
Код:
                  Error_string = proc->readAllStandardError();
                  Standart_output_string = proc->readAllStandardOutput();
                  all = proc->readAll();
пусто(.такое впечатление что процес ничево не возвращяет... мож я чтото не так делаю???


Название: Re: QT и Архивы
Отправлено: merke от Сентября 07, 2010, 11:03
как все страшно у тебя в коде. Попробуй тот вариант который я тебе предложил.


Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 07, 2010, 12:31
как все страшно у тебя в коде. Попробуй тот вариант который я тебе предложил.

почемуже страшно ;D
ето все так для отладки просто сделано)))
а сам код можно вообще уменьшыть до:


Код:
                  QProcess *proc = new QProcess();
                  proc->execute("cp -R  /media/sda1/proba_2.zip /home/root");
                  aaalll_string =proc->readAll() + proc->readAllStandardError() +proc->readAllStandardOutput();
                  proc->close();

или вот так ( ето сделает тоже что и Ваш вариант, только короче  ;) , хотя Ваша идея считывать и проверять файлы в цыклке хорошая :), я раньше чтото не подумал о таком варианте ):


Код:
                  QProcess *proc = new QProcess();
                  proc->execute("cp -R  /media/sda1/proba_2.zip /home/root");
                  if((QFile::exists("proba_2.zip"))) //чтото там сделать, или вывести код ошыбки если что...
                  proc->close();

только хочется 1м вариантом чтоб считать весь лог и ошыбку и все что выводит при етом консоль... но почемуто не считывает :) (не считываетproc->readAll() proc->readAllStandardError() proc->readAllStandardOutput() - там пусто)



Название: Re: QT и Архивы
Отправлено: ysfox от Сентября 14, 2010, 10:24
так может кому пригодится, всеравно к теме подходит  ;)
добил работу с процесами - теперь все нормально - вот код:

Код:
QProcess proc;

proc.setProcessChannelMode(QProcess::MergedChannels);
proc.start("cp -R /media/sda1/ red_2.tar /home/root/Updates"); //считываем с флешки архив и записываем ево в /home/root/Updates
    if (!proc.waitForFinished()) //ждем окончяния процеса или таймаута (если ничево не указано то таймаут через 30 секунд)
         qDebug() << "1Make failed:" << proc.errorString(); //если неудачя считываем код ошыбки и выводим в консоль
    else
         qDebug() << "1Make output:" << proc.readAll(); //считываем результат и выводим в консоль
 proc.close();
proc.kill(); //так на всякий случяй - чтоб уже наверняка убить)

сдесь вместо того чтоб выводить в терминал можно просто анализовать ети строки на ключевые слова, например командой
Код:
if((Rez_String.contains("done"))&&(!(Rez_String.contains("error"))))
или чемто похожым и выводить сообщение об ошыбке, или ещо чтото делать :)