在Ruby中创建zip存档而不将存档文件保存到磁盘

时间:2015-03-09 09:15:58

标签: ruby file stringio rubyzip

我尝试创建zip存档而不将存档文件保存到磁盘。所以首先我用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

这项工作正常,但在创建保存存档文件之前。

其次我尝试编写此代码,首先使用我需要的文件创建StringIO zip存档,然后我不能以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

做错了什么?以及如何正确地做到这一点?

1 个答案:

答案 0 :(得分:4)

实测!

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)