import (
"bytes"
"compress/gzip"
"io/ioutil"
)
// ...
var b bytes.Buffer
w := gzip.NewWriter(&b)
w.Write([]byte("hello, world\n"))
w.Close() // You must close this first to flush the bytes to the buffer.
err := ioutil.WriteFile("hello_world.txt.gz", b.Bytes(), 0666)
func UnpackGzipFile(gzFilePath, dstFilePath string) (int64, error) {
gzFile, err := os.Open(gzFilePath)
if err != nil {
return 0, fmt.Errorf("open file %q to unpack: %w", gzFilePath, err)
}
dstFile, err := os.OpenFile(dstFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0660)
if err != nil {
return 0, fmt.Errorf("create destination file %q to unpack: %w", dstFilePath, err)
}
defer dstFile.Close()
ioReader, ioWriter := io.Pipe()
defer ioReader.Close()
go func() { // goroutine leak is possible here
gzReader, _ := gzip.NewReader(gzFile)
// it is important to close the writer or reading from the other end of the
// pipe or io.copy() will never finish
defer func(){
gzFile.Close()
gzReader.Close()
ioWriter.Close()
}()
io.Copy(ioWriter, gzReader)
}()
written, err := io.Copy(dstFile, ioReader)
if err != nil {
return 0, err // goroutine leak is possible here
}
return written, nil
}
6条答案
按热度按时间0sgqnhkj1#
所有的压缩包都实现了相同的接口。
还有这个要打开
carvr3hs2#
答案和Laurent差不多,但文件是io:
rks48beu3#
对于读取部分,类似于**.gz**文件的有用ioutil.ReadFile可以是:
xfb7svmp4#
下面是将gzip文件解压缩到目标文件的函数:
b1payxdu5#
我决定合并其他人的想法和答案,只是提供一个完整的例子程序。显然有很多不同的方法来做同样的事情。这只是一种方法:
有这样一个完整的例子应该有助于将来的参考。
jgzswidk6#
将接口类型的Go对象压缩为输入
为了解压缩相同的数据,
注意,如果您在写入后没有关闭Writer对象,
ioutil.ReadAll(r)
将返回io.EOF或io.ErrUnexpectedEOF。我假定在Close()上延迟将正确关闭对象,但它不会。不要延迟写入器对象。