最近はwxPythonが少し遅く感じたので、wxPythonの本家、wxWidgetsで書き直してる。
wxWidgetsの公式: wxWidgets: Cross-Platform GUI Library
zipファイルから、特定のコンテンツを引っ張り出したかった。
正確に言えば、zipから特定のコンテンツのInputStreamを取得したかった。
Pythonではzipfileモジュールがとてつもなく便利だったが、C++はあまり馴染みがないので、
どんな方法で取り出すのかさっぱりだった。
wxWidgetsでのzipの扱いは、
wxWidgets: Archive Formatsを参考にした。
ここでは、wxZipEntryなるものの取り出し方は、書いてあったが、これではwxZipEntryの情報しかわからない。
いろいろ試行錯誤した結果、
#include <wx/wfstream.h>
#include <wx/mstream.h>
#include <wx/zipstrm.h>
auto zip_path = wxT("somezipfile.zip");
// まずはZipInputStreamを用意する
auto ist = new wxFileInputStream(zip_path);
wxZipInputStream *stream = new wxZipInputStream(*ist);
// 続いてZipEntryの取得
wxZipEntry entry = stream->GetNextEntry();
// Entryの確認
std::cout << "size: " << entry->GetSize() << std::endl;
std::cout << "name: " << entry->GetName() << std::endl;
// バッファの準備
char *buff = new char[entry->GetSize()];
stream->Read(buff, entry->GetSize());
wxMemoryInputStream *mstrm = new wxMemoryInputStream(buff, entry->GetSize());
// これでOK
これで作成したwxMemoryInputStreamはwxZipEntryが指しているコンテンツだけなので、
特定のファイルをwxFileInputStreamで開いたものとほとんど同様に扱うことができる
wxPythonよりwxWidgetsの方が情報少ない気がするよ( ; ; )


コメント