Ruby Unzip String - PullRequest
       6

Ruby Unzip String

4 голосов
/ 03 мая 2011

Мне нужно работать с заархивированной ( обычной Zip ) строкой в ​​Ruby. Очевидно, я не могу сохранить временный файл с Ruby-Zip или Zip-Ruby .

Есть ли практичный способ распаковать эту строку?

Ответы [ 5 ]

4 голосов
/ 14 января 2015

rubyzip поддерживает StringIO начиная с версии 1.1.0

require "zip"
# zip is the string with the zipped contents
Zip::InputStream.open(StringIO.new(zip)) do |io|
  while (entry = io.get_next_entry)
    puts "#{entry.name}: '#{io.read}'"
  end
end
2 голосов
/ 15 февраля 2013

См. Zip / Ruby Zip::Archive.open_buffer(...):

require 'zipruby'
Zip::Archive.open_buffer(str) do |archive|
  archive.each do |entry|
    entry.name
    entry.read
  end
end
1 голос
/ 03 мая 2011

Поскольку в Ruby-Zip отсутствует поддержка чтения / записи объектов ввода-вывода, вы можете подделать File. Что вы можете сделать, это следующее:

  1. Создайте класс с именем File в модуле Zip, который наследуется от StringIO, например, класс Zip :: File
  2. Создать существует? метод класса (возвращает true)
  3. Создать метод открытого класса (возвращает StringIO в блок)
  4. Метод экземпляра закрытия заглушки (при необходимости)
  5. Возможно, для этого понадобится больше поддельных методов
0 голосов
/ 01 февраля 2012

Как упоминает @Roman, rubyzip в настоящее время не хватает чтения и записи объектов ввода-вывода (включая StringIO.new(s)). Попробуйте вместо этого использовать zipruby , например:

gem install zipruby

require 'zipruby'

# Given a string in zip format, return a hash where 
# each key is an zip archive entry name and each
# value is the un-zipped contents of the entry
def unzip(zipfile)
  {}.tap do |h|
    Zip::Archive.open_buffer(zipfile) do |archive|
      archive.each {|entry| h[entry.name] = entry.read }
    end
  end
end
0 голосов
/ 03 мая 2011

Библиотека zlib.Прекрасно работает с StringIO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...