COM*_*COM 5 gzip file tar nim-lang
寻找一种使用Nim编程语言(版本0.11.2)从tar.gz存档读取文件的方法.说我有一个档案
/my/path/to/archive.tar.gz
Run Code Online (Sandbox Code Playgroud)
和该档案中的文件
my/path/to/archive/file.txt
Run Code Online (Sandbox Code Playgroud)
我的目标是能够在Nim中逐行读取文件的内容.在Python中,我可以使用tarfile模块执行此操作.在Nim中有libzip和zlib模块,但文档很少,没有示例.还有zipfiles模块,但我不确定它是否能够使用tar.gz档案.
在我公司的一个项目中,我们一直在使用以下模块,将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)
Run Code Online (Sandbox Code Playgroud)
但是您还需要能够读取tar头,以便在未压缩的gzip流中找到所需文件的正确位置.您可以将一些现有的C库(如libtar)包装起来执行此操作,或者您可以滚动自己的实现.
据我所知,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")
Run Code Online (Sandbox Code Playgroud)
如果您想要一个干净且灵活的解决方案,这将是为libarchive库编写包装器的好机会;)。