mieki256's diary



2013/12/29() [n年前の日記]

#2 [ruby] Rubyでzipファイルにアクセスする実験をしてみたり

rubyzipなるライブラリを使うと zip ファイルにアクセスできるらしいと知ったので、手元でも実験してみたり。 実験用スクリプトとzipをまとめたファイルも置いときます。→ _zip_extract.zip

_zip_open_rubyzip.rb
# zipファイルを開いて中にある画像ファイルを表示する。
# rubyzip使用版。
#
# rubyzip, dxruby, Ayame/Ruby が必要

require 'zip'
require 'dxruby'
require_relative 'ayame'

# zipファイルを開いて、中にあるファイルを読み取る
bindata = {}
Zip::File.open("res.zip") do |zipfile|
  zipfile.each do |f|
    name = f.name # ファイル名取得
    size = f.size # ファイルサイズ取得
    next if name =~ /\/$/ # ディレクトリは除外
    # puts "#{name} , #{size}"
    
    # bindata[name] = f.get_input_stream.read
    bindata[name] = zipfile.read(f.name)
  end
end

# 画像作成、サウンドデータの記録を行う
imgs = []
bgms = []
bindata.each_key do |fn|
  if fn =~ /\.png$/
    # 画像作成
    imgs.push(Image.loadFromFileInMemory(bindata[fn]))
  elsif fn =~ /\.ogg$/
    # サウンドデータを記録
    bgms.push(bindata[fn])
  end
end

# サウンドを再生
bgm = Ayame.load_from_memory(bgms[0])
bgm.play(0)

# メインループ
Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  # 読み込んだ画像を全て表示
  x, y = 0, 0
  imgs.each do |img|
    Window.draw(x, y, img)
    y += img.height
  end
end
画像ファイルも表示できたし、oggの再生もできた。

処理速度は速いのか遅いのかよく分からないけど、とりあえず、一つにまとめたzipファイルから、画像やサウンドデータを取り出すことはできそうだなと…。

ただ、パスワードをかけたzipにアクセスする方法が分からず。rubyzip ではなくて、zipruby なるライブラリなら、パスワードつきzipにもアクセスできるみたいだけど…。そっちは Ruby 1.9 までの対応のようで…。

ziprubyも試してみたり。 :

一応は試してみるかなと。

_ziprubyをRuby1.9.3ではインストール出来ない → 出来た(インストール方法は最後に追記) - 趣味プログラマがまれになんかしたことの記録 を参考に、Ruby 1.9.3 上にインストール。
gem install zipruby1.9 --platform mswin32

パスワードを設定した zip を扱ってみたのだけど…。

_zip_open_zipruby.rb
# zipファイルを開いて中にある画像ファイルを表示する。
# zipruby使用版。パスワードつきzipファイルを対象にする。
#
# ただし問題有り。
# 一度パスワードを解除してしまうと、
# その後、別ツールでも平気で開ける zip になってしまう…。
#
# zipruby, dxruby, Ayame/Ruby が必要

require 'zipruby'
require 'dxruby'
require_relative 'ayame'

res_zip = "res_encrypt.zip"

# zipの解凍パスワード
passwd = "hogefugapiyo"

bindata = {}

# zipのパスワードを設定
# Zip::Archive.encrypt(res_zip, passwd)

# zipのパスワードを解除
Zip::Archive.decrypt(res_zip, passwd)

# zipファイルを開いて、中にあるファイルを読み取る
Zip::Archive.open(res_zip) do |ar|

  # ar.decrypt(passwd) # パスワードを解除
  n = ar.num_files # ファイル数を取得(ディレクトリも含む)

  # ファイル数分、繰り返す
  n.times do |i|
    entry_name = ar.get_name(i)
    ar.fopen(entry_name) do |f|
      name = f.name # ファイル名取得
      size = f.size # ファイルサイズ取得(展開後)
      comp_size = f.comp_size # ファイルサイズ取得(圧縮時)

      # puts "#{name} , #{size} , #{comp_size}"

      # ディレクトリの場合はサイズが0になる
      # サイズが0ではないなら、何らかのファイル
      if size > 0
        bindata[name] = f.read
      end
    end
  end
end

# 画像作成、サウンドデータの記録を行う
imgs = []
bgms = []
bindata.each_key do |fn|
  if fn =~ /\.png$/
    # 画像作成
    imgs.push(Image.loadFromFileInMemory(bindata[fn]))
  elsif fn =~ /\.ogg$/
    # サウンドデータを記録
    bgms.push(bindata[fn])
  end
end

# サウンドを再生
bgm = Ayame.load_from_memory(bgms[0])
bgm.play(0)

# メインループ
Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  # 読み込んだ画像を全て表示
  x, y = 0, 0
  imgs.each do |img|
    Window.draw(x, y, img)
    y += img.height
  end
end
アクセスはできたのだけど、一度パスワードを解除してしまうと、その後は他のツールでもアクセス可能な、フツーの zip になってしまう…。

さりとて、一度アクセスした後で再度Rubyスクリプト中からパスワードを設定し直してみても、その次からはアクセスできない謎のzipになってしまって。うーん。

さらに、Ruby 2.0 では zipruby が使えないようで。
  • gem install zipruby してもエラーが出るし。
  • gem install zipruby --platform mswin32 をして、一見インストールできたように見えても、スクリプトを実行すると「zipruby.so がねえよ」と怒られる。
なかなか厳しい。

参考ページ。 :


以上です。

過去ログ表示

Prev - 2013/12 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project