如何在 Zip::OutputStream 中创建文件夹?

How do I create folders inside Zip::OutputStream?

我想创建一个包含 文件夹目录 的 Zip 文件,使用 Ruby-on-Rails 和 Zip.

如何在 Zip::OutputStream 中创建文件夹或目录?

我目前拥有的

compressed_filestream = Zip::OutputStream.write_buffer do |zos|

  zos.put_next_entry "letter.odt"
  zos.write letter

  zos.put_next_entry "spreadsheet.ods"
  zos.write spreadsheet

  zos.put_next_entry "essay.odt"
  zos.write essay
end

compressed_filestream.rewind
send_data compressed_filestream.read, filename: "neuer_tn.zip"

此代码生成一个 Zip 文件,我可以从中提取三个文件,分别称为“letter.odt”、“spreadsheet.ods”和“essay.odt”。

现在,我希望前两个文件位于文件夹或目录中。当我解压缩 Zip 文件时,我应该会看到一个名为“letter and spreadsheet”的文件夹,里面有两个文件,外面有一个文件。我该怎么做?

是否可以实现类似下面的代码?

compressed_filestream = Zip::OutputStream.write_buffer do |zos|

  zos.create_folder "letter and spreadsheet" do 
  
    zos.put_next_entry "letter.odt"
    zos.write letter

    zos.put_next_entry "spreadsheet.ods"
    zos.write spreadsheet

  end

  zos.put_next_entry "essay.odt"
  zos.write essay
end

compressed_filestream.rewind
send_data compressed_filestream.read, filename: "neuer_tn.zip"

Rails 6.0.3.4, ruby 2.6.6p146(2020-03-31 修订版 67876)[x86_64-linux]

非常简单,在 put_next_entry 调用中包含文件夹名称...

zos.put_next_entry "awesome_folder_here/letter.odt" 

你甚至可以更深入...

zos.put_next_entry "awesome_folder_here/subfolder_too/letter.odt" 

而且 zip 知道如何将它们放在一起。