Как мне накачать и прочитать zip-файлы, используя zlib? - PullRequest
0 голосов
/ 27 января 2012

Как распаковать файл или прочитать содержимое файла zip, чтобы выбрать, что извлечь?

.pencast - сжатый zip, поэтому я могу использовать в bash следующее:

unzip -j *.pencast "*.aac"

Но в Ruby:

require 'zlib'

afile = "/Users/name/Desktop/Somepencast.pencast"
puts afile

def inflate(string)
  zstream = Zlib::Inflate.new
  buf = zstream.inflate(string)
  zstream.finish
  zstream.close
  buf
end

inflate(afile)

Результат:

/Users/name/Desktop/Somepencast.pencast
prog1.rb:11:in `inflate': incorrect header check (Zlib::DataError)
  from prog1.rb:11:in `inflate'
  from prog1.rb:17

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Это может помочь: Как получить содержимое архива с помощью библиотеки rubyzip?

zip и gzip - это разные протоколы, для которых требуется разное программное обеспечение для распаковки.

Лично Я нахожу, что rubyzip немного неудобно использовать, поэтому я склонен подумать о том, чтобы просто выдать команду unzip, которую вы уже используете.Вы можете сделать это с помощью

`unzip -j *.pencast "*.aac"` # note backticks

или

system( 'unzip -j *.pencast "*.aac"' )

(или другими различными способами)

1 голос
/ 21 мая 2012

Вот как вы можете прочитать записи в файле ZIP и при необходимости прочитать его содержимое.В этом примере будет напечатано содержимое записи README.txt из zip-файла с именем foo.zip:

require 'zip/zip'
zipfilename = 'foo.zip'
Zip::ZipFile.open(zipfilename) do |zipfile|
  zipfile.each do |entry|
    puts "ENTRY: #{entry.name}" # To see the entry name.
    if entry.name == 'README.txt'
      puts(entry.get_input_stream.read) # To read the contents.
    end
  end
end
...