在不保存解压版本的情况下从tar.gz文件中读取

3

我在磁盘上保存了一个tar.gz文件,并且希望保持其压缩状态,但是我需要打开存档内的一个文件,从中读取一些信息并将其保存在其他地方。

File structure:
base_folder
  file_i_need.txt
  other_folder
  other_file

代码(并不多-我尝试了1000万种不同的方法,这是剩下的)

def self.open_file(file)
    uncompressed_file = Gem::Package::TarReader.new(Zlib::GzipReader.open(file))
uncompressed_file.rewind
end

当我在控制台中运行它时,我得到了以下结果。
<Gem::Package::TarReader:0x007fbaac178090>

我可以在这些条目上运行命令。但我还没想出如何在不将其解压到磁盘上的情况下打开一个条目并从中读取内容。我主要需要文本文件中的字符串。

非常感谢您的帮助。也许我只是漏了什么……


2
TarReader是可枚举的,返回Entry。因此,您需要使用uncompressed_file.detect { |f| f.fullname == 'base_folder/file_i_need.txt' }.read来读取文件。 - Aleksei Matiushkin
谢谢。这完全有道理,不知道为什么我自己没想到。如果你想得到积分,请将其发布为答案 :) - tomr
问题已经解决,我将其作为答案发布了。 - Aleksei Matiushkin
1个回答

6

TarReader 是一个 Enumerable,可以返回 Entry

也就是说,要按文件名获取文件的文本内容,可以这样做:

uncompressed = Gem::Package::TarReader.new(Zlib::GzipReader.open(file))
text = uncompressed.detect do |f| 
  f.fullname == 'base_folder/file_i_need.txt'
end.read
#⇒ Hello, I’m content of the text file, located inside gzipped tar

希望能有所帮助。

非常感谢。我卡住了! - tomr

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