从 tar.gz 存档中读取文件在 Nim 中的实现

5
寻找一种使用Nim编程语言(version 0.11.2)从tar.gz归档文件中读取文件的方法。比如说我有一个归档文件:

/my/path/to/archive.tar.gz

和存档文件中的一个文件

my/path/to/archive/file.txt

我的目标是能够在Nim中逐行读取文件内容。在Python中,我可以使用tarfile模块实现这一点。在Nim中,有libzip和zlib模块,但文档很少,也没有示例。还有zipfiles模块,但我不确定它是否能够处理tar.gz归档文件。

3个回答

7

在我公司的一个项目中,我们使用以下模块,将gzip文件作为流进行公开:

import
  zlib, streams

type
  GZipStream* = object of StreamObj
    f: GzFile

  GzipStreamRef* = ref GZipStream

proc fsClose(s: Stream) =
  discard gzclose(GZipStreamRef(s).f)

proc fsReadData(s: Stream, buffer: pointer, bufLen: int): int =
  return gzread(GZipStreamRef(s).f, buffer, bufLen)

proc fsAtEnd(s: Stream): bool =
  return gzeof(GZipStreamRef(s).f) != 0

proc newGZipStream*(f: GzFile): GZipStreamRef =
  new result
  result.f = f
  result.closeImpl = fsClose
  result.readDataImpl = fsReadData
  result.atEndImpl = fsAtEnd
  # other methods are nil!

proc newGZipStream*(filename: cstring): GZipStreamRef =
  var gz = gzopen(filename, "r")
  if gz != nil: return newGZipStream(gz)

但是你也需要能够读取tar头文件以便在未压缩的gzip流中找到所需文件的正确位置。你可以包装一些现有的C库,如libtar来完成这个任务,或者你可以自己编写实现方式


2

2
据我所知,libzip和zlib不能用于读取tar文件(只支持zip归档和/或原始字符串压缩,而tar.gz需要gzip + tar)。不幸的是,目前似乎还没有Nim库可以读取tar.gz存档文件。
如果您可以接受一个快速而简单的基于tar的解决方案,您可以这样做:
import osproc

proc extractFromTarGz(archive: string, filename: string): string =
  # -z extracts
  # -f specifies filename
  # -z runs through gzip
  # -O prints to STDOUT
  result = execProcess("tar -zxf " & archive & " " & filename & " -O")

let content = extractFromTarGz("test.tar.gz", "some/subpath.txt")

如果您想要一个干净而灵活的解决方案,这将是编写libarchive库包装器的好机会。;)

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