【问题标题】:How to decompress tar.gz file in go? [duplicate]go中如何解压tar.gz文件? [复制]
【发布时间】: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()。

标签: go gzip tar


【解决方案1】:
package main

import (
    "archive/tar"
    "compress/gzip"
    "fmt"
    "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())
            }
            if _, err := io.Copy(outFile, tarReader); err != nil {
                log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
            }
            outFile.Close()

        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 {
        fmt.Println("error")
    }
    ExtractTarGz(r)
}

【讨论】:

  • 代码只回答,没有任何文字描述你改变/做了什么,为什么不是很有用。
  • @DaveC 在这个版本中他没有延迟就关闭了。
猜你喜欢
  • 2011-11-01
  • 2011-10-30
  • 1970-01-01
  • 2018-06-26
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多