Zip/Ruby 0.2.8

http://rubyforge.org/projects/zipruby/

Zip/Ruby 0.2.8をリリースしました。
変更点は次のとおり。

オンメモリっぽいAPIの追加

メモリ上のデータを操作するAPIを追加しました。
裏でテンポラリファイルを作っているので、オンメモリの作業ではないです。

require 'zipruby'
$stdout.binmode

buf = ''

Zip::Archive.open_buffer(buf, Zip::CREATE) do |ar|
  ar.add_buffer('bar.txt', 'zoo');
end

Zip::Archive.open_buffer(buf) do |ar|
  ar.each do |f|
    puts f.name
  end
end

「標準入力からZipファイルを読み込んで、暗号化して出力する」とかできます。

#!/usr/bin/env ruby
require 'zipruby'
$stdout.binmode

begin
  ar = Zip::Archive.open_buffer(ARGF.read)
  ar.encrypt('pass')
  print ar.read
ensure
  ar.close
end


~/work$ cat foo.zip | ./enc.rb > bar.zip

テンポラリファイルはArchiveをクローズしたタイミングで削除されます。
ArchiveがGCに回収されるタイミングでも削除されます。

任意のZipデータをちまちま読み込むこともできます。

stream = lambda do
  return ... # Zipデータをちまちま返す。ストリームの終わりはnil
end

Zip::Archive.open_buffer(stream) do |ar|
  ar.each do |f|
    puts f.name
  end
end

こまごました変更点

  • Zip::TRUNCフラグの追加
  • (あれば)OSのmkstemp、fseeko、ftelloを使うようにした
  • Zip::Archive#add(&block)でブロック内の例外を無視するようにした