C++ (Qt)
bool DocBot::makeHTMLArhive(QString anarhiveName)
{
QTextStream out(stdout);
out.setCodec(outCodec);
QString outString;
CurrentPathSwitcher sw(target);
// F:/7-Zip/7z.exe a ../Qt_4.4_html_ru.7z *.html
QString cmd = QString("%1 %2 %3")
.arg(arhivecommand)
.arg("../" + anarhiveName)
.arg("*.html");
QProcess *process = new QProcess(this);
out << "Creat Process:" << cmd << endl;
out.flush();
cmd = cmd.toUtf8();
process->setProcessChannelMode(QProcess::MergedChannels);
process->start(cmd);
if (!process->waitForStarted()){
qDebug() << "Process" << cmd << "may not started";
return false;
}
QTime t;
t.start();
int sec = 1000; // 1000 ms
int min = 60* sec; // 60 s
int maxtime = 1*min;
while(1){
if (process->waitForReadyRead(maxtime)){
outString += QString::fromUtf8(process->readAllStandardOutput().data());
t.restart();
}
if (process->state() != QProcess::Running){
if (process->exitCode() == 0){
qDebug() << "Process" << cmd << "finished ok";
return true;
}else{
out << outString;
out.flush();
qDebug() << "Process" << cmd << "finished with error";
return false;
}
}
if (t.elapsed() >= maxtime){
qDebug() << "Process " << cmd << " may not finished";
return false;
}
}
}
из реальной программы. Эта функция создаёт архив из html-файлов. Смысл переменных объявленных за пределами этой функции должен быть очевиден.
На CurrentPathSwitcher можно не обращать внимания. он переключает текущий путь на новый, переданный в его конструктор, а при вызове деструктора (выход из функции) возвращает текущий путь приложения обратно.