【发布时间】:2019-08-24 16:23:06
【问题描述】:
我有一个名为file.tar.gz 的文件,里面有一个folder。使用go我想解压并将文件夹保存在当前目录中。
我在论坛上找到了这些代码,但在我的情况下不起作用。
package main
import (
"archive/tar"
"compress/gzip"
"io"
"log"
"os"
)
func ExtractTarGz(gzipStream io.Reader) {
uncompressedStream, err := gzip.NewReader(gzipStream)
if err != nil {
log.Fatal("ExtractTarGz: NewReader failed")
}
tarReader := tar.NewReader(uncompressedStream)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
}
switch header.Typeflag {
case tar.TypeDir:
if err := os.Mkdir(header.Name, 0755); err != nil {
log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
}
case tar.TypeReg:
outFile, err := os.Create(header.Name)
if err != nil {
log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
}
defer outFile.Close()
if _, err := io.Copy(outFile, tarReader); err != nil {
log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
}
default:
log.Fatalf(
"ExtractTarGz: uknown type: %s in %s",
header.Typeflag,
header.Name)
}
}
}
func main() {
r, err := os.Open("./file.tar.gz")
if err != nil {
log.Fatalf(err.Error())
}
ExtractTarGz(r)
}
它给了我错误:
ExtractTarGz: Create() failed: open go/pkg/linux_amd64_race/unicod/utf16.a: too many open files exit status 1
【问题讨论】:
-
“它在我的情况下不起作用”是什么意思?
-
我尝试使用我的文件运行代码,但它返回了错误。
-
部分文件解压后是否失败?该代码使解压缩的文件保持打开状态,直到函数结束(defer outfile.Close())。取而代之的是,在 io.Copy 完成后关闭文件。
-
是的@bserdar 它解压缩文件夹内的部分文件然后崩溃。我按照你说的做了,但它仍然在 Create() 上崩溃。
-
错了。您仍在使用 defer,它将关闭推迟到函数返回。使用 outfile.Close(),而不是延迟 outfile.Close()。