はじめに
rubyで、zipファイル中のzipファイルにアクセスする必要があり、いろいろ悩んでアクセスできたので、記録しておきます。
zipファイル中のzipのデータをioとして処理できずに悩みましたが、StringIOを使って解決することができました。
やりたい事例
-
hoge_hoge.zip
の中にhoge.zip
ファイルがアーカイブされている。 -
hoge.zip
の中にhoge1.txt
とhoge2.txt
がアーカイブされている。 -
hoge_hoge.zip
からhoge1.txt
とhoge2.txt
にアクセスしたい。
hoge_hoge.zip
+-- hoge.zip
+-- hoge1.txt
+-- hoge2.txt
hoge1.txt
hoge1 contents
hoge2.txt
hoge2 contents
コード
zip_in_zip.rb
require 'zip'
Zip::InputStream.open('hoge_hoge.zip') do |zio1|
while (entry1 = zio1.get_next_entry)
puts "entry1 file: [#{entry1.name}]"
if entry1.name == 'hoge.zip'
sio = StringIO.new(zio1.read, 'r+')
Zip::InputStream.open(sio) do |zio2|
while (entry2 = zio2.get_next_entry)
puts "+- entry2 file: [#{entry2.name}]"
puts " contents: [#{zio2.readline.chomp}]"
end
end
end
end
end
実行結果
entry1 file: [hoge.zip]
+- entry2 file: [hoge1.txt]
contents: [hoge1 contents]
+- entry2 file: [hoge2.txt]
contents: [hoge2 contents]