В wxWidgets есть такая отличная штука, как wxDirTraverser
.
Что это и с чем его едят? Официальная документация говорит нам вот что:
wxDirTraverser
вызывается для каждого найденного объекта в указанном каталоге. Поиск выполняется рекурсивно для всех подкаталогов.wxDirTraverser
есть методы, которые вызываются для каждого файла или подкаталога (соответственно OnFile()
и OnDir()
), в которые передается путь найденного файла или каталога. Это значит что, получая имя каждого файла, мы можем сразу же добавить этот файл в архив без необходимости получения списка всех файлов и подкаталогов в массив (как мы бы сделали при использовании wxDir::GetAllFiles()
).#ifndef _WX_DIR_TRAVERSER_ZIP_H #define _WX_DIR_TRAVERSER_ZIP_H #include <wx/wx.h> #include <wx/dir.h> #include <wx/zipstrm.h> #include <wx/filename.h> #include <wx/wfstream.h> class wxDirTraverserZIP : public wxDirTraverser { public: wxDirTraverserZIP(wxZipOutputStream & stream, const wxString & baseDir) : m_Stream(stream), m_BaseDir(baseDir) { } virtual wxDirTraverseResult OnFile(const wxString& filename) { do { wxFileName newFileName(filename); newFileName.MakeRelativeTo(m_BaseDir); if(!m_Stream.PutNextEntry(newFileName.GetFullPath())) { break; } wxFileInputStream in(filename); if(!in.IsOk()) { break; } m_Stream.Write(in); return wxDIR_CONTINUE; } while(false); return wxDIR_STOP; } virtual wxDirTraverseResult OnDir(const wxString& dirname) { return wxDIR_CONTINUE; } private: wxZipOutputStream & m_Stream; wxString m_BaseDir; }; #endif
bool PackFolder(const wxString & srcFolderName, const wxString & zipFileName) { do { wxFFileOutputStream out(zipFileName); if(!out.IsOk()) break; wxCSConv conv(wxT("cp-866")); wxZipOutputStream zip(out, 9, conv); if(!zip.IsOk()) break; wxDirTraverserZIP traverser(zip, srcFolderName); wxDir srcDir(srcFolderName); if(srcDir.Traverse(traverser, wxEmptyString) == (size_t)-1) break; return true; } while(false); return false; } ... // Pack the folder if(!PackFolder(wxT("c:\\test"), wxT("c:\\some.zip"))) { //Handle error here }
Введение Уже долгое время не пишу статьи о разработке, хотя сам процесс написания мне очень…
I can see that there is still a lot of topics at wxWidgets forums related…
I've just published the source code of wxToolBox component and a couple of sample apps at…
Microsoft released their Kinect SDK several days ago. So, for those wxWidgets developers who are…
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to…
Вдохновленнный читаемой нынче книгой My Job Went to India: 52 Ways to Save Your Job…
View Comments
Sorry I can't read most of the writing on this website, but I'd very much like to use the DirTraverserZIP class you've written in a GPL project. Is that ok?
Thanks for your good work!
Cheers,
Gerald
Yes, this is ok. It is free for both commercial and non-commercial use.