Я хочу сделать резервную копию своей базы данных, создав zip-файл с помощью qprocess в программе QT, в приведенном ниже коде он делает это как файл sql. Как я могу сделать резервную копию внутри zip-файла?
QProcess dump(this);
QStringlist args;
QString path = "C:/Users/ali/Desktop/dbfile/db.sql";
args<<"-uroot"<<"-proot"<<"denemesql";
dump.setStandardOutputFile(path);
dump.start("mysqldump.exe",args);
if (!dump.waitForStarted(1000))
{
qDebug()<<dump.errorString();
}
dump.waitForFinished(-1);
можете вы помочь мне?





Самый простой способ — выполнить это в два этапа: сделать дамп, а затем заархивировать.
bool dump1() {
QString path = "C:/Users/ali/Desktop/dbfile/db.sql";
QString zipPath = "C:/Users/ali/Desktop/dbfile/db.zip";
QProcess dump;
dump.setProgram("mysqldump.exe");
dump.setArguments({"-uroot", "-proot", "denemesql"});
dump.setStandardOutputFile(path);
dump.start();
if (!dump.waitForStarted()) {
qDebug() << dump.error();
return false;
}
if (!dump.waitForFinished()) {
qDebug() << dump.error();
return false;
}
QProcess zip;
zip.setProgram("C:\\Program Files\\7-Zip\\7z.exe");
zip.setArguments({"a", zipPath, path});
zip.start();
if (!zip.waitForStarted()) {
qDebug() << dump.error();
return false;
}
if (!zip.waitForFinished()) {
qDebug() << dump.error();
return false;
}
QFile(path).remove();
return true;
}
Вы можете избежать создания временного файлового конвейера для вывода дампа непосредственно в 7z, но вы будете ограничены форматом gzip.
bool dump2() {
QString gzipPath = "C:/Users/ali/Desktop/dbfile/db.gz";
QString fileName = "db.sql";
QProcess dump;
dump.setProgram("mysqldump.exe");
dump.setArguments({"-uroot", "-proot", "denemesql"});
QProcess zip;
zip.setProgram("C:\\Program Files\\7-Zip\\7z.exe");
zip.setArguments({"a", gzipPath, "-si" + fileName});
dump.setStandardOutputProcess(&zip);
dump.start();
zip.start();
if (!dump.waitForStarted()) {
qDebug() << dump.error();
return false;
}
if (!zip.waitForStarted()) {
qDebug() << zip.error();
return false;
}
if (!dump.waitForFinished()) {
qDebug() << dump.error();
return false;
}
if (!zip.waitForFinished()) {
qDebug() << zip.error();
return false;
}
return true;
}
Сложный способ - использовать zlib, вы можете добавить его в свой проект и использовать
zipOpen
zipOpenNewFileInZip
zipWriteInFileInZip
zipCloseFileInZip
zipClose
функции. Для этого требуется связать библиотеку и включить заголовки и исходники из zlib\contrib\minizip.
Я бы сказал примерно так: оба решают проблему в разумные сроки, используя разумное количество системных ресурсов.
QString gzipPath = "C:/Users/ali/Desktop/dbfile/db.gz"; Я изменил .zip вместо .gz. какой из них будет эффективнее? Есть ли между ними различия.
Какой способ будет эффективнее?