在 QT C++ 的 zip 文件中将数据库文件备份为 sql

Backup the database file as sql inside the zip file on QT C++

我想通过在 QT 程序中使用 qprocess 创建一个 zip 文件来备份我的数据库,在下面的代码中它将它作为一个 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

函数。这需要链接库并包括 headers 和来自 zlib\contrib\minizip.

的来源