田園都市技術屋online日記

アクセスカウンタ

zoom RSS RubyでZip圧縮を扱うメモ

<<   作成日時 : 2011/01/19 23:52   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

RubyでZip圧縮したファイルをいじらなくてはいけなくなったので調査したメモ。 

WindowsXPでZipは素の状態でも扱うことが可能だが、Ruby標準モジュールでZipは扱えない。gemを探したところ以下3つが引っかかった。

  • zipruby

  • rubyzip

  • archive-zip


パッケージ名がたいへんまぎらわしい。 blogなどで見るとziprubyの使用例が多いようであるが、archive-zipが自分には使い良かったのでメモ。  gemを使ってインストールするとio-likeに依存しているので同時に新ストールされる。

単純にファイルに展開して書き出すならばArchive::ZipのクラスメソッドだけでOK。 

アーカイブの中のどれかのファイルという場合にはArchive :: Zip :: Entryオブジェクトを使う。  Archive::Zipのインスタンスに対して、get_entry (zip_path) メソッド(対象名が既知の場合)、each (&b) メソッド(対象が未知の場合)を使用すると、Archive :: Zip :: Entryオブジェクトを返してくれる。 Archive :: Zip :: Entryオブジェクトのzip_pathに名前が格納されているので、対象名が未知の場合でもそこから名前を得ることができる。

エントリはファイルの他にもディレクトリやsymlinkの可能性があるが、ファイルの場合にはArchive :: Zip :: Entry :: Fileオブジェクトが入手できる。  Archive :: Zip :: Entry :: Fileオブジェクトのfile_data ()メソッドを使うと解凍されたファイルのio-likeのオブジェクトを入手できる。

依存関係でインストールされる io-likeオブジェクトはIOやFileと同じようにメソッドを取り揃えている「IOのようなもの(そのまんま)」である。 標準付属のStringIOに近い。 オンメモリで処理してくれるので、テンポラリファイルを作成したくないときに便利に使えるのでないかと思う。

ただし罠1として、file_data ()メソッドで得られたファイルのio-likeのオブジェクトはseekable?に対してtrueを返すが、なぜか先頭に移動以外のseekができない。 つまりランダムアクセスができないわけで、最初結構ハマった。 先頭だけにでも移動できるならばseekableという解釈らしい。 ランダムアクセスが必要な場合はStringIOオブジェクトにコピーするなどする回避策が必要なようだ。

また罠2として、作成日情報などが省略されたZipに対して、ライブラリが不正だとerrorを吐くようだ。 意外とこういうZipファイルを作成するフリーソフトはあったりする。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
VISVIM サンダル
RubyでZip圧縮を扱うメモ 田園都市技術屋online日記/ウェブリブログ ...続きを見る
VISVIM サンダル
2013/07/10 00:00

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
RubyでZip圧縮を扱うメモ 田園都市技術屋online日記/BIGLOBEウェブリブログ
文字サイズ:       閉じる