你如何使用wxWidgets递归压缩目录?

时间:2016-11-04 13:59:16

标签: zip wxwidgets

如何使用wxWidgets递归压缩目录?我想将生成的zip文件放在目标目录旁边的同一级别。唯一的输入只是一个char字符串,其中包含要压缩的目录的路径。

1 个答案:

答案 0 :(得分: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为条目设置元数据。