【发布时间】:2016-10-25 16:46:27
【问题描述】:
我正在努力处理 Go 中的嵌套 zip 文件(其中一个 zip 文件包含另一个 zip 文件)。我正在尝试递归一个 zip 文件并列出它包含的所有文件。
archive/zip 为您提供了两种处理 zip 文件的方法:
- zip.NewReader
- zip.OpenReader
OpenReader 打开磁盘上的文件。 NewReader 接受 io.ReaderAt 和文件大小。当您使用其中任何一个遍历压缩文件时,您会为 zip 中的每个文件得到一个 zip.File。要获取文件 f 的文件内容,请调用 f.Open,它会为您提供 zip.ReadCloser。要打开嵌套的 zip 文件,我需要使用 NewReader,但 zip.File 和 zip.ReadCloser 不满足 io.ReaderAt 接口。
zip.File 有一个私有字段 zipr,这是一个 io.ReaderAt,zip.ReadCloser 有一个私有字段 f,这是一个 os.File,它应该满足 NewReader 的要求。
我的问题:有什么方法可以打开嵌套的 zip 文件,而无需先将内容写入磁盘上的文件,或者将整个内容读入内存。
看起来所需的一切都在 zip.File 中可用,但没有导出。我希望我错过了什么。
【问题讨论】:
-
我担心最简单的做法是将其复制到
bytes.Buffer或磁盘中。嵌套拉链有多大? -
您可能会发现godoc.org/golang.org/x/tools/godoc/vfs/zipfs 的 api 也更适用。不确定。
-
@captncraig 这是一个小型扫描程序,所以我不知道我会遇到什么 zip 文件。我也不确定这会有多普遍,我只是觉得能够使用流将所有东西连接在一起非常接近。
bytes.Buffer上的电话很好,我想我可以在阅读整个内容之前检查文件大小,因为我可以访问它。