最近は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
の方が情報少ない気がするよ( ; ; )
コメント