Zip 目录递归

Zip directory recursion

我正在使用旧 Qt - ZipWriter class 创建 zip 存档。问题是当我想添加目录时。 addDirectory 方法的默认 Qt 代码 - d->addEntry(ZipWriterPrivate::Directory, archDirName, QByteArray());。它不添加任何内容,只添加空目录。因此,我对其进行了改进以添加目录和内容。

我的代码:

QList<QString> dirs;
int recursion = 0;

void ZipWriter::addDirectory(const QString &dirPath)
{
    QDir archDir(dirPath);
    archDir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
    dirs << addDirSeparator(archDir.dirName());

    if (archDir.exists()) {
        QString archDirName = "";

        if (recursion > 0) {
            for (int i = recursion; i < dirs.count(); i++) {
                 archDirName = dirs.first().append(dirs.at(i));
            }
        } else {
            archDirName = dirs.at(recursion);
        }

        if (!archDir.isEmpty()) {
            const QStringList archFileList = archDir.entryList();

            if (archFileList.count() > 0) {
                for (QString archFile : archFileList) {
                     QFileInfo archFileInfo(QDir::toNativeSeparators(QString("%1/%2").arg(archDir.absolutePath(), archFile)));

                     if (archFileInfo.isDir()) {
                         recursion++;
                         addDirectory(archFileInfo.absoluteFilePath());
                     } else {
                         QFile zipFile(archFileInfo.absoluteFilePath());
                         zipFile.open(QIODevice::ReadOnly);
                         addFile(QString("%1%2").arg(archDirName, archFile), zipFile.readAll());
                         zipFile.close();
                     }
                }
            }
        } else {
            d->addEntry(ZipWriterPrivate::Directory, archDirName, QByteArray());
        }
    }
}

现在,它递归地添加目录和内容,但是当目录处于同一级别时会出现问题,它将它附加到末尾。我想,我必须使用 STL 容器来跟踪目录,例如 QMap 但问题是如何获取当前目录级别?有任何想法吗?谢谢。

更新: 01.05.2022

我已将我的代码更改为:

void ZipWriter::addDirectory(const QString &dirPath)
{
    QDirIterator dirIt(dirPath, QDir::AllEntries | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
    while (dirIt.hasNext()) {
        QString archDirPath = dirIt.next();    
        QFile zipFile(archDirPath);
        zipFile.open(QIODevice::ReadOnly);

        if (!dirIt.fileInfo().isDir()) {
            addFile(archDirPath, zipFile.readAll());
        }

        zipFile.close();
    }
}

它以正确的顺序递归添加所有内容,但我还有另一个问题。现在,它添加了存档的完整路径。例如,我想将此文件夹及其内容添加到存档中:22610.1_amd64_en-us_professional_00fb7ba0_convert。 在存档中我得到:C:\Users\userProfile\Downloads610.1_amd64_en-us_professional_00fb7ba0_convert。任何想法如何使这个相对路径或 trim 它?谢谢。

你可以使用QDirIterator递归遍历目录和子目录,我相信你根本不需要添加非空目录,只需要文件就可以了。

以及为什么要在qt中使用stl容器,请使用qt容器。