【问题标题】:Ruby: Create A Gzipped Tar ArchiveRuby:创建一个 Gzipped Tar 档案
【发布时间】:2010-11-09 22:19:12
【问题描述】:

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

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

似乎已经提出了一些准解决方案,而且很多信息似乎已经过时了。

例如,“ruby tar”的热门 Google 搜索结果为 this thread,该搜索始于 2007 年,显然没有解决方案。

另一个排名靠前的搜索结果是this one describing ruby tar。它可以追溯到 2002 年,而该公告并未完全激发信心。

我还看到了各种关于炮击 unix tar 等的报告。

所以,我知道有很多方法可以做到这一点,但我真的希望从尝试过几种替代方法的人那里推荐最可靠、最方便的方法。

有什么想法吗?

【问题讨论】:

标签: ruby gzip tar


【解决方案1】:

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

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

【讨论】:

  • 我喜欢这个 - 非常简单。即使它不检查您的系统上是否安装了“tar”,但如果他们有 ruby​​,这是一个合理的假设:) 不要忘记它周围的反引号“`”。所以不允许我在前面添加空格以便它们可见。
【解决方案2】:

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

【讨论】:

  • Minitar 似乎不允许从流中写入 tar,只能从文件中写入。不过,它可以输出到流中。
【解决方案3】:

以下示例展示了如何结合 Ruby Zlib 中的 GzipWriter 类和 RubyGems 中的 TarWriter 类来创建一个 gzipped 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2012-04-30
    • 2012-12-30
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多