如何使用命令行解压Go compress/gzip包生成的文件?

如何使用命令行解压Go compress/gzip包生成的文件?,go,Go,我有一个使用Gocompress/gzip包生成的文件,代码如下 payload := bytes.NewBuffer(nil) gw := gzip.NewWriter(payload) tw := tar.NewWriter(gw) ... tw.Close() gw.Close() 如何在Mac上从命令行解压此文件?我尝试了gunzip,但失败了 $ gunzip test.gz gunzip: test.gz: not in gzip format 我也试着不走运地跟着 $ tar

我有一个使用Go
compress/gzip
包生成的文件,代码如下

payload := bytes.NewBuffer(nil)
gw := gzip.NewWriter(payload)
tw := tar.NewWriter(gw)
...
tw.Close()
gw.Close()
如何在Mac上从命令行解压此文件?我尝试了
gunzip
,但失败了

$ gunzip test.gz
gunzip: test.gz: not in gzip format
我也试着不走运地跟着

$ tar -xvf test.gz
tar: Unrecognized archive format
tar: Error exit delayed from previous errors.

您的问题是,在示例代码中,您从未向tar编写器进行过编写。为了生成包含内容的有效targz文件,您需要记住:

  • 添加至少一个文件需要在tarball中
  • 每个文件都需要标题
您需要使用为每个文件创建头,然后您可以通过调用将文件的内容以字节的形式写入

然后,您可以使用
tar-xvf test.tgz
将其解压,就像您在前面的示例中提到的那样

以下是为了演示,我在机器上快速编写的示例代码:

主程序包
进口(
“压缩/gzip”
“存档/tar”
“操作系统”
“fmt”
“时间”
)
func main(){
//创建包含其他文件的targz文件。
文件,err:=os.Create(“test.tgz”)
如果错误!=零{
恐慌(错误)
}
gw:=gzip.NewWriter(文件)
延迟gw.Close()
tw:=tar.NewWriter(gw)
延迟tw.Close()
//在targz中创建文件
如果err:=addFile(tw,“myfile.test”,“示例内容”);err!=nil{
恐慌(错误)
}
}
func addFile(tw*tar.Writer、文件名、内容字符串)错误{
标题:=&tar.header{
名称:fileName,
大小:int64(len(content)),
模式:0655,,
ModTime:time.Now(),
}
错误:=tw.WriteHeader(头)
如果错误!=零{
返回fmt.Errorf(“无法写入文件%q:%w的头”,文件名,错误)
}
_,err=tw.Write([]字节(内容))
如果错误!=零{
返回fmt.Errorf(“无法写入文件%q:%w的内容”,文件名,err)
}
归零
}
结果如下:

$>转到运行main.go
$>ls-la
总数5
drwxr-xr-x 12 ullaakut员工384 2月12日05:34/
drwxr-xr-x 29 ullaakut staff 928 Jan 28 14:56/
-rw-r--r--@1 ullaakut员工6148 12月25日13:01,DS_商店
-rw-r--r--1 ullaakut staff 888 Feb 12 05:34 main.go
-rw-r--r--1 ullaakut员工121 2月12日05:34 test.tgz
$>tar-zxvf test.tgz
x myfile.test
$>cat myfile.test
示例内容

正如您所看到的,归档文件被提取并解压缩得很好:)

如果它有帮助的话,生成该文件的实际代码位于,谢谢您的回答。标题正在写在这里