Search code examples
rubyfilestringiorubyzip

Create zip archive without save archiving file to disk in Ruby


I tried to create zip archive without save archiving file to disk. So First I write method with save to disk:

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

This work fine but before create save archiving file.

Second I tried to write this code, first create StringIO zip archive with file witch I need, second I cant save them to disk in bin mode:

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

What a do wrong? and how to do it right way?


Solution

  • Found!

    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)