1
如何使用wxWidgets遞歸壓縮目錄?我想將生成的壓縮文件放在同一級別的目標目錄旁邊。唯一的輸入只是一個char字符串,它包含要壓縮的目錄的路徑。如何使用wxWidgets遞歸壓縮目錄?
如何使用wxWidgets遞歸壓縮目錄?我想將生成的壓縮文件放在同一級別的目標目錄旁邊。唯一的輸入只是一個char字符串,它包含要壓縮的目錄的路徑。如何使用wxWidgets遞歸壓縮目錄?
可能有很多方法可以做到這一點,但最直接的方法可能是合併wxDirTraverser和wxZipOutputStream。在文檔基本上剪切和粘貼從樣品,派生橫移類可能類似於:
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爲條目設置元數據。
這工作得很好,謝謝。一個問題,但。說我的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
應該說已解壓到a/b/c/d/e/f/g,並且zip文件在真正的d下(因爲它應該是這樣)。因此這個目錄鏈開始在真正的d之下。整個路徑是在第一個評論已經超時,我不能編輯。我真的希望這是有道理的。謝謝。 – ees
避免這是'temp.Replace(m_folder,wxEmptyString);'在OnFile方法中。我猜如果傳遞給wxDirZipper的文件夾參數與該方法中文件名的第一部分不完全匹配,則替換將失敗。我猜如果替換失敗,該方法應該嘗試解析文件名,刪除所有的初始文件夾,然後重建其餘項作爲用於PutNextEntry方法的名稱。 –