为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 golang exec.Cmd 使用 tar 命令

如何使用 golang exec.Cmd 使用 tar 命令

Go
交互式爱情 2022-12-13 16:20:45
我有一个 tar.gz 文件,我需要使用 golang 解压缩它。我试过像“archive/tar”这样的库,但它们给了我错误:archive/tar: invalid tar header.现在我的想法是使用 exec 运行 tar 命令并解压 tarball,但它总是以代码 2 退出。我的代码:func unpack(tarName string) error {path, _ := os.Getwd()//err := Untar(path+"/"+tarName, path+"/")fmt.Printf(path + "/" + tarName)cmd := exec.Command("tar", "-xfv", path+"/"+tarName)cmd.Stdout = os.Stdouterr := cmd.Run()return err}
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

如果您尝试压缩tar.gz文件,您首先需要解压缩 gzip。



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)

}


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信