Ruby:创建一个Gzipped Tar存档

Ric*_*aca 18 ruby gzip tar

使用Ruby创建gzipped tar存档的最佳方法是什么?

我有一个Rails应用程序需要创建一个压缩存档以响应用户操作.理想情况下,可以直接写入压缩文件,而无需先生成中间临时文件.在红宝石的Zlib库似乎支持直接gzip压缩.我怎样才能将它与焦油输出结合起来?

似乎已经提出了许多准解决方案,并且许多信息似乎已经过时.

例如,"ruby tar"的顶级Google搜索结果给出了这个线程,该线程始于2007年,显然没有解决方案.

另一个高级搜索结果是这个描述红宝石焦油.它的历史可以追溯到2002年,而这一消息并未真正激发人们的信心.

我也看到了各种关于unix tar等的报道.

所以,我知道有很多方法可以做到这一点,但我真的正在寻找一个推荐给那些尝试了一些替代方案的人最可靠和最方便的方法.

有任何想法吗?

Sco*_*ott 10

如果您在unix下运行,则可以将文件写入磁盘,然后对tar/gzip进行系统调用.

`tar -czf #{file_name}.tar.gz #{file_name}`
Run Code Online (Sandbox Code Playgroud)


Sam*_*ron 6

这个Ruby Minitar项目于2009年更新,似乎可以解决您的问题


bac*_*avy 6

以下示例演示如何组合 Ruby Zlib 中的 GzipWriter 类和 RubyGems 中的 TarWriter 类来创建 gzip 压缩的 tar 存档:

require 'rubygems/package'

filenames_and_contents = {
  "filename" => "content",
}

File.open("archive.tar.gz", "wb") do |file|
  Zlib::GzipWriter.wrap(file) do |gzip|
    Gem::Package::TarWriter.new(gzip) do |tar|
      filenames_and_contents.each_pair do |filename, content|
        tar.add_file_simple(filename, 0644, content.length) do |io|
          io.write(content)
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)