Как я могу скопировать каталог внутри zip-архива во второй zip-архив с помощью rubyzip?

У меня есть ZIP-архив, содержащий несколько каталогов. Используя драгоценный камень rubyzip, я хотел бы получить доступ к архиву .zip, скопировать указанный каталог (и его содержимое) и переместить каталог во второй архив .zip.

В идеале мне не нужно было бы извлекать содержимое первого архива .zip, а затем повторно заархивировать его во второй архив. Я надеюсь, что есть способ использовать методы, предоставленные в драгоценном камне rubyzip.


person rswolff    schedule 04.09.2009    source источник


Ответы (3)


После консультации с одним из сопровождающих драгоценного камня rubyzip я узнал, что это невозможно.

person rswolff    schedule 04.09.2009
comment
Пожалуйста, проверьте ответ Джона. Я только что успешно протестировал его. - person knut; 10.05.2014

Библиотека RubyZip должна была быть обновлена ​​с тех пор, чтобы поддерживать ее. Это сработало для меня.

require 'rubygems'
require 'zip' # gem 'rubyzip', '>= 1.0'

Zip::File.open('large.zip', false) do |input|
  Zip::File.open('small.zip', true) do |output|
    input.glob('my_folder_name/*') do |entry|
      entry.get_input_stream do |input_entry_stream|
        output.get_output_stream(entry.name) do |output_entry_stream|
          # you could also chunk this, rather than reading it all at once.
          output_entry_stream.write(input_entry_stream.read)
        end
      end
    end
  end
end

Для версий RubyZip ‹ 1.0 вместо require 'zip/zip' используйте Zip::ZipFile вместо Zip::File.

person John Douthat    schedule 18.06.2012
comment
Спасибо за Ваш ответ. Я просто искал именно этот код - у меня он работал нормально. - person knut; 10.05.2014
comment
Спасибо! Я включил ваш вклад в ответ. - person John Douthat; 12.05.2014

Это немного метод грубой силы (и он может работать или не работать для вашего приложения), но вы можете скопировать весь первый zip-файл, а затем использовать методы rubyzip, чтобы удалить все, кроме целевого каталога, из скопированного файла.

Теоретически то, о чем вы спрашиваете, должно быть возможно, если вы используете сжатие deflate (которое сохраняет каждый файл как отдельно сжатый элемент).

person Mike Buckbee    schedule 04.09.2009
comment
На самом деле я попробовал метод грубой силы, о котором вы упомянули, но содержимое ZIP-файла настолько велико, что мне нужно сделать несколько копий - это оказывается слишком медленным. - person rswolff; 04.09.2009
comment
Было бы полезно добавить дополнительную информацию к вашему вопросу: на какой ОС вы работаете? Размер застежек? Причины хранения файлов в zip. - person Mike Buckbee; 04.09.2009