你如何使用 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 为条目设置元数据。