Ruby: 创建一个Gzipped Tar归档文件

20

如何用Ruby创建一个gzipped tar归档文件?

我有一个Rails应用程序需要在用户操作后创建一个压缩存档文件。理想情况下,可以直接写入到压缩文件中,而不需要先生成中间临时文件。Ruby Zlib库似乎支持直接gzip压缩。如何将其与tar输出结合起来?

已经提出了许多准解决方案,很多信息已经过时。

例如,“ruby tar”搜索的顶部结果是这个线程,它始于2007年,显然没有解决方案。

另一个排名较高的搜索结果是描述ruby tar的这个, 它可以追溯到2002年,该公告并没有激发人们的信心。

我也看到了各种使用unix tar等的报告。

所以,我知道有很多方法可以做到这一点,但我真的正在寻找一个可靠和方便的推荐,希望是由尝试过几种替代方案的人提供的。

有任何想法吗?


这与我的问题非常相似:https://dev59.com/QFzUa4cB1Zd3GeqP3nkX 有人找到答案了吗? - Tony R
我还在尝试中,但这看起来是个好主意。Ruby的Archive::Tar - FilBot3
从搜索“创建gzipped tar”的第一页着陆到这里。请考虑将问题概括为非Ruby使用情况。 - vhs
3个回答

12

如果你是在Unix下运行,你可以将文件写入磁盘,然后运行系统调用tar/gzip来压缩它们。

`tar -czf #{file_name}.tar.gz #{file_name}`

我喜欢这个 - 非常简单。即使它没有检查你的系统上是否安装了"tar",但如果他们安装了Ruby,那么这是一个合理的假设 :) 不要忘记在它周围加上反引号"`"。 Stack Overflow不允许我在前面添加空格以使其可见。 - Matt Connolly

6
这个 Ruby Minitar 项目在2009年更新过,看起来可以解决你的问题。

Minitar似乎不允许从流中写入tar文件,只能从文件中写入。但是它可以输出到流。 - Tony R

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接