2012-12-19 21 views
3

我有一個我想壓縮的文件和文件夾的目錄。我正在使用qt-project quazip。所以我想我寫了一個函數,打包一個包含文件結構的目錄的所有內容。如何用quazip壓縮目錄/文件夾?

如何在zip文件中創建文件夾?我用QuaZipNewInfo嘗試過,但無法使其工作。

例如,我想這個內容壓縮tmp的文件夾:

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); 
+0

什麼是錯誤消息,當它沒有工作? –

+0

我沒有收到任何錯誤。當我想解壓縮文件時,它不會提取文件夾(因爲我可能不會將它們壓縮到zip !?)。因此,我將所有子文件夾的所有文件解壓到一個文件夾中。 – mrgremlin

+0

我在下面編輯了我的答案。 –

回答

2

我沒有收到任何錯誤。當我想解壓縮文件時,它不會提取文件夾(因爲我可能不會將它們壓縮到zip !?)。因此,我將所有子文件夾的所有文件解壓到一個文件夾中。

看來,在你的函數你遞歸得到文件夾中的文件,但文件夾本身。嘗試創建一個文件夾,以便在遞歸查找子目錄中的文件時壓縮文件。

你可能想看看這個答案: https://stackoverflow.com/a/2598649/1819900

如何通過QuaZip提供的事業嗎? http://quazip.sourceforge.net/classJlCompress.html

+1

對不起,但我擔心我不明白你的問題。我不用我自己的實現來解壓縮它,而是使用任何其他壓縮工具,所以我對解壓縮過程沒有任何影響。 – mrgremlin

+0

啊,好吧。我懂了。我重讀了這個問題,我正在計算出它:) –

+0

對不起,我不清楚,我更新了一個例子 – mrgremlin

3

在創建QuaZipNewInfo對象,指定路徑,當你想將其存儲在zip作爲第一個參數的文件名的文件,路徑和文件名的文件在磁盤上的第二個參數。例如:

添加C:/test/myFile.txt測試/ MYFILE.TXT拉鍊:

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

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;