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容器。
我正在使用旧 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容器。