1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include "clZipReader.h"
#include "macros.h"
clZipReader::clZipReader(const wxFileName& zipfile)
: m_file(new wxFileInputStream(zipfile.GetFullPath()))
, m_zip(new wxZipInputStream(*m_file))
{
}
clZipReader::~clZipReader() { Close(); }
void clZipReader::Close()
{
wxDELETE(m_file);
wxDELETE(m_zip);
}
void clZipReader::Extract(const wxString& filename, const wxString& directory)
{
wxZipEntry* entry(NULL);
entry = m_zip->GetNextEntry();
while(entry) {
if(::wxMatchWild(filename, entry->GetName())) {
// Incase the entry name has a directory prefix, remove it
wxString fullpath;
fullpath << directory << "/" << entry->GetName();
// Change to posix style
fullpath.Replace("\\", "/");
// Remove any duplicate double slashes
while(fullpath.Replace("//", "/")) {}
if(entry->IsDir()) {
// a folder
wxFileName::Mkdir(fullpath, wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
} else {
wxFileName outfile(fullpath);
// ensure that the path to the file exists
outfile.Mkdir(wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
wxFFileOutputStream out(outfile.GetFullPath());
if(out.IsOk()) {
m_zip->Read(out);
out.Close();
}
}
}
wxDELETE(entry);
entry = m_zip->GetNextEntry();
}
}
|