Создать zip-архив без сохранения файла архивации на диск в Ruby

Я попытался создать zip-архив без сохранения файла архивации на диск. Итак, сначала я пишу метод с сохранением на диск:

begin
  file = Zip::File.open("#{file_name}.zip", Zip::File::CREATE)
  save_file file_name
  file.add(file_name, file_name)
rescue IOError => e
  puts "Error: #{e}"
ensure
  file.close unless file.nil?
  File.delete file_name
end

Это работает нормально, но перед созданием сохраните файл архивации.

Во-вторых, я попытался написать этот код, сначала создайте zip-архив StringIO с нужными мне файлами, во-вторых, я не могу сохранить их на диск в режиме bin:

string_io = Zip::OutputStream.write_buffer do |zos|
  zos.put_next_entry(file_name)
  zos.write dictionary.join(', ')
end

# Something wrong below
File.open("#{file_name}.zip", 'wb') do |file|
  file.write string_io
  file.close
end

Что делать не так? и как правильно сделать?


person khusnetdinov    schedule 09.03.2015    source источник
comment
Круто, это может сэкономить место на диске!   -  person itsnikolay    schedule 10.03.2015


Ответы (1)


Нашел!

string_io = Zip::OutputStream.write_buffer do |zos|
  zos.put_next_entry(file_name)
  zos.write dictionary.join(', ')
end
# Rewind 
string_io.rewind
# Write simply to file in bin mode
IO.write("#{file_name}.zip", string_io.sysread)
person khusnetdinov    schedule 09.03.2015