wxWidgets Zipファイルから特定のエントリのInputStreamを取得する

最近は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

これで作成したwxMemoryInputStreamwxZipEntryが指しているコンテンツだけなので、 特定のファイルをwxFileInputStreamで開いたものとほとんど同様に扱うことができる

wxPythonよりwxWidgetsの方が情報少ない気がするよ( ; ; )

タイトルとURLをコピーしました