Go 如何为tar中的文件获取所需的路径,同时为它们添加tar

Go 如何为tar中的文件获取所需的路径,同时为它们添加tar,go,tar,Go,Tar,我一直在使用这段代码来写入tar文件。我是这样称呼它的 err=retarIt(dirTopDebug,path),其中dirTopDebug是我的tar文件的路径(/tmp/abc.tar),而path是我要添加的文件的路径(/tmp/xyz/…)。当我解开生成的tar文件时,我发现在abc.tar中的文件是以/tmp/xyz/.格式放置的。但是我希望它们像xyz/…一样放在tar中,即没有tmp文件夹 我该怎么做 func TarGzWrite(_path string, tw *tar.W

我一直在使用这段代码来写入tar文件。我是这样称呼它的
err=retarIt(dirTopDebug,path)
,其中
dirTopDebug
是我的tar文件的路径(
/tmp/abc.tar
),而
path
是我要添加的文件的路径(
/tmp/xyz/…
)。当我解开生成的tar文件时,我发现在
abc.tar
中的文件是以
/tmp/xyz/.
格式放置的。但是我希望它们像
xyz/…
一样放在tar中,即没有
tmp
文件夹

我该怎么做

func TarGzWrite(_path string, tw *tar.Writer, fi os.FileInfo) {
    fr, _ := os.Open(_path)
    //handleError(err)
    defer fr.Close()

    h := new(tar.Header)
    h.Name = _path
    h.Size = fi.Size()
    h.Mode = int64(fi.Mode())
    h.ModTime = fi.ModTime()

    err := tw.WriteHeader(h)
    if err != nil {
        panic(err)
    }

    _, _ = io.Copy(tw, fr)
    //handleError( err )
}

func IterDirectory(dirPath string, tw *tar.Writer) {
    dir, _ := os.Open(dirPath)
    //handleError( err )
    defer dir.Close()
    fis, _ := dir.Readdir(0)
    //handleError( err )
    for _, fi := range fis {
        fmt.Println(dirPath)
        curPath := dirPath + "/" + fi.Name()
        if fi.IsDir() {
            //TarGzWrite( curPath, tw, fi )
            IterDirectory(curPath, tw)
        } else {
            fmt.Printf("adding... %s\n", curPath)
            TarGzWrite(curPath, tw, fi)
        }
    }
}

func retarIt(outFilePath, inPath string) error {
    fw, err := os.Create(outFilePath)
    if err != nil {
            return err
    }
    defer fw.Close()
    gw := gzip.NewWriter(fw)
    defer gw.Close()

    // tar write
    tw := tar.NewWriter(gw)
    defer tw.Close()

    IterDirectory(inPath, tw)
    fmt.Println("tar.gz ok")
    return nil
}

使用tar头中指定的任何名称。使用strings包的strings.LastIndex(或strings.Index)函数来分隔部分till/tmp

因此,如果上面TarGzWrite函数中的代码按如下方式修改,它将按照您希望的方式工作(注意:您可能希望用strings.Index替换下面的strings.LastIndex)

//TarGzWrite function same as above....
h := new(tar.Header)
//New code after this..
lastIndex := strings.LastIndex(_path, "/tmp")
fmt.Println("String is ", _path, "Last index is", lastIndex)
var name string
if lastIndex > 0 {
    name = _path[lastIndex+len("/tmp")+1:]
    fmt.Println("Got name:", name)
} else {
    //This would not be needed, but was there just for testing my code
    name = _path
}
// h.Name = _path
h.Name = name
h.Size = fi.Size()
h.Mode = int64(fi.Mode())