4

zipしたいファイルとフォルダのあるディレクトリがあります。qt-projectquazipを使用しています。そこで、ファイル構造を含むディレクトリのすべてのコンテンツをパックする関数を作成しようと思いました。

zipファイルにフォルダを作成するにはどうすればよいですか?QuaZipNewInfoで試しましたが、動作しませんでした。

たとえば、次のコンテンツを使用してtmp-folderを圧縮します。

tmp/1.txt
tmp/folder1/2.txt
tmp/folder1/3.txt
tmp/folder2/4.txt
tmp/folder2/folder3/5.txt

一般的なアーカイブツール(アーカイブユーティリティ)でファイルを抽出した後に得られるものは次のとおりです。

tmp/1.txt
tmp/2.txt
tmp/3.txt
tmp/4.txt
tmp/5.txt

これは私がこれまでに持っているものです:

void Exporter::zipFilelist(QFileInfoList& files, QuaZipFile& outFile, QFile& inFile, QFile& inFileTmp)
{
    char c;
    foreach(QFileInfo file, files) {
        if(file.isDir()  && file.fileName() != "." && file.fileName() != "..") {
            QFileInfoList infoList = QDir(file.filePath()).entryInfoList();
            zipFilelist(infoList, outFile, inFile, inFileTmp);
        }
        if(file.isFile()) {
            inFileTmp.setFileName(file.fileName());
            inFile.setFileName(file.filePath());

            if(!inFile.open(QIODevice::ReadOnly)) {
                qDebug() << "testCreate(): inFile.open(): " << inFile.errorString().toLocal8Bit().constData();
            }
            QuaZipNewInfo info(inFileTmp.fileName(), inFile.fileName());
            if(!outFile.open(QIODevice::WriteOnly, info)) {
                qDebug() << "testCreate(): outFile.open(): " << outFile.getZipError();
            }
            while(inFile.getChar(&c)&&outFile.putChar(c)) ;
            if(outFile.getZipError()!=UNZ_OK) {
                qDebug() << "testCreate(): outFile.putChar(): %d"<< outFile.getZipError();
            }

            outFile.close();
            if(outFile.getZipError()!=UNZ_OK) {
                qDebug() << "testCreate(): outFile.close(): %d"<< outFile.getZipError();
            }
            inFile.close();
        }
    }
}

そして、これは私が関数を呼び出す方法です:

QFileInfoList files = QDir(sourceFolder).entryInfoList();
QFile inFile;
QFile inFileTmp;
QuaZipFile outFile(&zip);
zipFilelist(files, outFile, inFile, inFileTmp);
4

3 に答える 3

3

QuaZipNewInfo オブジェクトを作成するときは、最初の引数として zip に格納するファイルへのパスとファイル名を指定し、2 番目の引数としてディスク上のファイルへのパスとファイル名を指定します。例:

C:/test/myFile.txttest/myFile.txtとして zip に追加:

QuaZipNewInfo("test/myFile.txt", "C:/test/myFile.txt")

于 2012-12-19T14:52:05.277 に答える
3

エラーは発生しません。ファイルを解凍したい場合、フォルダーは抽出されません (おそらくそれらを zip にパックしないため!?)。したがって、すべてのサブフォルダーのすべてのファイルを 1 つのフォルダーに解凍します。

関数では、フォルダー内のファイルを再帰的に取得しているようですが、フォルダー自体は取得していないようです。サブディレクトリ内のファイルを再帰的に検索するときに、ファイルを圧縮するフォルダーを作成してみてください。

この回答を調べてみてください: https://stackoverflow.com/a/2598649/1819900

QuaZip が提供するユーティリティはどうですか? http://quazip.sourceforge.net/classJlCompress.html

于 2012-12-19T14:21:43.120 に答える
0

zip ファイルにフォルダーを作成するには、「/」で終わる名前の空のファイルを作成する必要があります。答えにはファイル/フォルダーのリストは含まれていませんが、zip ファイルでのフォルダーの作成に焦点を当てています。

QDir sourceRootDir("/path/to/source/folder");

QStringList sourceFilesList; // list of path relative to source root folder
sourceFilesList << "relativePath.txt" << "folder" << "folder/relativePath";

QualZip zip("path/to/zip.zip");

if(!zip.open(QuaZip::mdCreate)){
  return false;
}

QuaZipFile outZipFile(&zip);

// Copy file and folder to zip file

foreach (const QString &sourceFilePath, sourceFilesList) {

    QFileInfo sourceFI(sourceRootDir.absoluteFilePath(sourceFilePath));


    // FOLDER (this is the part that interests you!!!)
    if(sourceFI.isFolder()){
        QString sourceFolderPath = sourceFilePath;
        if(!sourceFolderPath.endsWith("/")){
            sourceFolderPath.append("/");
        }

        if(!outZipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(sourceFolderPath, sourceFI.absoluteFilePath()))){
            return false;
        }
        outZipFile.close();


    // FILE
    } else if(sourceFI.isFile()){

        QFile inFile(sourceFI.absoluteFilePath());
        if(!inFile.open(QIODevice::ReadOnly)){
            zip.close();
            return false;
        }

        // Note: since relative, source=dst
        if(!outZipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(sourceFilePath, sourceFI.absoluteFilePath()))){
            inFile.close();
            zip.close();
            return false;
        }

        // Copy
        qDebug() << "         copy start";
        QByteArray buffer;
        int chunksize = 256; // Whatever chunk size you like
        buffer = inFile.read(chunksize);
            while(!buffer.isEmpty()){
            qDebug() << "         copy " << buffer.count();
            outZipFile.write(buffer);
            buffer = inFile.read(chunksize);
        }

        outZipFile.close();
        inFile.close();
    } else {
        // Probably simlink, ignore
    }
}
zip.close();
return true;
于 2014-07-01T18:30:04.813 に答える