你如何使用 wxWidgets 递归地压缩一个目录?
How do you recursively zip up a directory using wxWidgets?
如何使用 wxWidgets 递归压缩目录?我想将生成的 zip 文件放在同一级别的目标目录旁边。唯一的输入只是一个包含要压缩目录路径的字符串。
可能有很多方法可以做到这一点,但最直接的方法可能是组合 wxDirTraverser and a wxZipOutputStream。基本上从文档中的示例中剪切和粘贴,派生的遍历器 class 可能类似于:
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 为条目设置元数据。
如何使用 wxWidgets 递归压缩目录?我想将生成的 zip 文件放在同一级别的目标目录旁边。唯一的输入只是一个包含要压缩目录路径的字符串。
可能有很多方法可以做到这一点,但最直接的方法可能是组合 wxDirTraverser and a wxZipOutputStream。基本上从文档中的示例中剪切和粘贴,派生的遍历器 class 可能类似于:
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 为条目设置元数据。