2016-11-04 16 views
1

如何使用wxWidgets遞歸壓縮目錄?我想將生成的壓縮文件放在同一級別的目標目錄旁邊。唯一的輸入只是一個char字符串,它包含要壓縮的目錄的路徑。如何使用wxWidgets遞歸壓縮目錄?

回答

2

可能有很多方法可以做到這一點,但最直接的方法可能是合併wxDirTraverserwxZipOutputStream。在文檔基本上剪切和粘貼從樣品,派生橫移類可能類似於:

class wxDirZipper : public wxDirTraverser 
{ 
    public: 
     wxDirZipper(const wxString& zip_filename, const wxString& folder) 
     { 
      wxFileName folder_to_zip_filename(folder); 
      folder_to_zip_filename.Normalize(); 
      m_folder=folder_to_zip_filename.GetFullPath(); 
      m_zip = new wxZipOutputStream(new wxFileOutputStream(zip_filename)); 
     } 

     ~wxDirZipper() 
     { 
      delete m_zip; 
     } 

     wxDirTraverseResult OnFile(const wxString& filename) wxOVERRIDE 
     { 
      wxFileInputStream fis(filename); 
      m_zip->PutNextEntry(Chop(filename)); 
      m_zip->Write(fis); 
      return wxDIR_CONTINUE; 
     } 

     wxDirTraverseResult OnDir(const wxString& dirname) wxOVERRIDE 
     { 
      wxDir dir(dirname); 

      if(!dir.HasFiles() && !dir.HasSubDirs()) 
      { 
       m_zip->PutNextDirEntry(Chop(dirname)); 
      } 

      return wxDIR_CONTINUE; 
     } 

    private: 
     wxString Chop(const wxString& filename) const 
     { 
      wxFileName fullpath(filename); 
      fullpath.Normalize(); 
      wxString temp = fullpath.GetFullPath(); 
      temp.Replace(m_folder,wxEmptyString); 

      return temp; 
     } 

     wxZipOutputStream* m_zip; 
     wxString m_folder; 
}; 

這樣,你會喜歡的東西稱之爲:

wxString folder_to_zip = <whatever> 
wxString zip_filename = folder_to_zip+".zip"; 

wxDirZipper zipper(zip_filename, folder_to_zip); 
wxDir dir(folder_to_zip); 
dir.Traverse(zipper); 

這是一個基本的實現,並有很多改進的餘地。例如,您可以在覆蓋zip文件之前進行檢查,或使用wxZipEntry爲條目設置元數據。

+0

這工作得很好,謝謝。一個問題,但。說我的cwd是a/b/c/d,下面是e/f/g。我想創建一個zip文件e.zip並將其放在d下。它應該解壓到e/f/g。但是,發生的事情是它在正確的地方創建,但它解壓到/ b/c/d/a/b/c/d/e/f/g。謝天謝地,a/b/c/d的第二個拷貝是空的,除了繼續鏈接所需的一個目錄外。我希望這是有道理的。非常感謝你。 – ees

+0

應該說已解壓到a/b/c/d/e/f/g,並且zip文件在真正的d下(因爲它應該是這樣)。因此這個目錄鏈開始在真正的d之下。整個路徑是在第一個評論已經超時,我不能編輯。我真的希望這是有道理的。謝謝。 – ees

+0

避免這是'temp.Replace(m_folder,wxEmptyString);'在OnFile方法中。我猜如果傳遞給wxDirZipper的文件夾參數與該方法中文件名的第一部分不完全匹配,則替換將失敗。我猜如果替換失敗,該方法應該嘗試解析文件名,刪除所有的初始文件夾,然後重建其餘項作爲用於PutNextEntry方法的名稱。 –