读取 tar.gz 中的文件名或文件数

Read the file names or the number of files in tar.gz

我有一个 tar.gz 文件,其中包含多个存档的 csv 文件。我需要读取文件名列表或至少读取文件数。

这是我试过的:

require 'zlib'

file = Zlib::GzipReader.open('test/data/file_name.tar.gz')
file.each_line do |line|
  p line
end

但这只会打印 csv 文件中的每一行,而不是文件名。我也试过这个:

require 'zlib'

Zlib::GzipReader.open('test/data/file_name.tar.gz') { | f |
  p f.read
}

读起来类似,但是是逐字符而不是逐行。

知道如何获取文件名列表或至少获取存档中的文件数吗?

您需要对未压缩的输出使用 tar reader

".tar.gz" 表示应用了两个进程来生成文件。首先,一组文件 "tarred" 组成一个“.tar”文件,其中包含一系列(文件头块,未压缩的文件数据)单元。然后将其压缩为单个字节流,以生成“.tar.gz”。实际上,.tar 文件很可能从未存储在任何地方,而是作为字节流生成并动态压缩以直接写出 .tar.gz 文件。

要获取内容,您需要反转过程,解压缩,然后将结果提供给 tar reader 以解释文件头块并提取数据。同样,您可以解压缩并即时读取 tarred 文件内容,无需存储中间的 .tar 文件。