在Ruby中,如何将tar归档流直接提取到文件系统?

时间:2012-10-22 00:58:04

标签: ruby archive tar

我正在使用Grit(Ruby gem)来加载git repo,将一个给定的提交提取到一个文件夹,然后用它来“做东西”。 Grit支持使用archive_tar的git存档,它返回一个包含tar存档的字符串。如果可能的话,我想使用Ruby libs / gems将其提取到文件系统(而不是直接系统调用),并避免首先将数据保存到存档然后解压缩(这里真正寻找有效的单行)。 / p>

1 个答案:

答案 0 :(得分:2)

假设“包含tar档案的字符串”等同于

File.open("Downloads.tar", "rb") {|a| a.read }

我可以使用fileutils,stringio和minitar gem来完成此任务。 首先你需要安装minitar,它应该像

一样简单
gem install minitar

由于minitar不支持使用流的常规解包,我们将创建自己的基本解包方法。

require 'archive/tar/minitar'
require 'stringio'
require 'fileutils'

def unpack_tar(directory, string)
  FileUtils.mkdir_p(directory) if !File.exist?(directory)
  stringio = StringIO.new(string)
  input = Archive::Tar::Minitar::Input.new(stringio)
  input.each {|entry|
    input.extract_entry(directory, entry)
  }
end

unpack_tar("./test", File.open("Downloads.tar", "rb") {|a| a.read })

当然用Grit gem的archive_tar函数替换整个File.open部分。这当然是假设第一个假设,尽管我确信这个方法可以很容易地适应,以适应archive_tar实际返回的任何内容。