如何使用 ruby​​zip 将 zip 存档中的目录复制到第二个 zip 存档?

发布于 2024-08-04 15:19:43 字数 177 浏览 6 评论 0原文

我有一个包含多个目录的 .zip 存档。使用 ruby​​zip gem,我想进入 .zip 存档,复制指定的目录(及其内容)并将该目录移动到第二个 .zip 存档中。

理想情况下,我不必提取第一个 .zip 存档的内容,然后将它们重新压缩到第二个存档中。我希望有一种方法可以使用 ruby​​zip gem 中提供的方法。

I have a .zip archive containing several directories. Using the rubyzip gem I would like to reach into the .zip archive, copy a specified directory (and its contents) and move the directory into a second .zip archive.

Ideally I would not have to extract the contents of the first .zip archive, then re-zip them into a second archive. I'm hoping there is a way to use methods provided in the rubyzip gem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

强辩 2024-08-11 15:19:43

从那时起,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

The RubyZip library must have been updated since then to support it. This worked for me.

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

For versions of RubyZip < 1.0, require 'zip/zip' instead, and use Zip::ZipFile instead of Zip::File

纵情客 2024-08-11 15:19:43

在与 ruby​​zip gem 的维护者之一核实后,我了解到这是不可能的。

After checking with one of the maintainers of the rubyzip gem, I have learned that this is not possible.

弄潮 2024-08-11 15:19:43

这是一种有点暴力的方法(可能适用于您的应用程序,也可能不适用于您的应用程序),但您可以复制整个第一个 zip 文件,然后使用 ruby​​zip 方法从复制的文件中删除除目标目录之外的所有内容。

理论上,如果您使用 deflate 压缩(将每个文件存储为单独的压缩项目),您所要求的应该是可能的。

This is a bit of a brute force method (and may or may not work for your application), but you could copy the entire first zip file and then use rubyzip methods to delete everything but the target directory from the copied file.

Theoretically what you are asking should be possible if you are using deflate compression (which stores every file as an individually compressed item).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文