如何使用wxWidgets递归压缩目录?我想将生成的zip文件放在目标目录旁边的同一级别。唯一的输入只是一个char字符串,其中包含要压缩的目录的路径。
答案 0 :(得分:2)
可能有很多方法可以做到这一点,但最简单的方法可能是合并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为条目设置元数据。