Golang:从 tar 中提取的文件引发权限错误

我已经编写了以下代码来对文件进行 tar 处理,代码可以工作,但奇怪的是,如果我解压归档文件,文件权限就会消失,因此除非我对文件进行 chmod 处理,否则我无法读取它:


package main


import (

    "archive/tar"

    "io/ioutil"

    "log"

    "os"

)


func main() {


    c, err := os.Create("/path/to/tar/file/test.tar")

    if err != nil {

        log.Fatalln(err)

    }


    tw := tar.NewWriter(c)


    f, err := os.Open("sample.txt")

    if err != nil {

        log.Fatalln(err)

    }


    fi, err := f.Stat()

    if err != nil {

        log.Fatalln(err)

    }


    hdr := &tar.Header{Name: f.Name(),

        Size: fi.Size(),

    }

    if err := tw.WriteHeader(hdr); err != nil {

        log.Fatalln(err)

    }


    r, err := ioutil.ReadFile("sample.txt")

    if err != nil {

        log.Fatalln(err)

    }


    if _, err := tw.Write(r); err != nil {

        log.Fatalln(err)

    }

    if err := tw.Close(); err != nil {

        log.Fatalln(err)

    }


}

知道我做错了什么吗?


叮当猫咪
浏览 160回答 1
1回答

大话西游666

您没有保留文件的原始权限。您正在手动创建标题,并仅指定名称和大小。相反,用于tar.FileInfoHeader构建标题。package mainimport (    "archive/tar"    "io/ioutil"    "log"    "os")func main() {    c, err := os.Create("/path/to/tar/file/test.tar")    if err != nil {        log.Fatalln(err)    }    tw := tar.NewWriter(c)    f, err := os.Open("sample.txt")    if err != nil {        log.Fatalln(err)    }    fi, err := f.Stat()    if err != nil {        log.Fatalln(err)    }    // create header from FileInfo    hdr, err := tar.FileInfoHeader(fi, "")    if err != nil {        log.Fatalln(err)    }    if err := tw.WriteHeader(hdr); err != nil {        log.Fatalln(err)    }    // instead of reading the whole file into memory, prefer io.Copy    r, err := io.Copy(tw, f)    if err != nil {        log.Fatalln(err)    }    log.Printf("Wrote %d bytes\n", r)}另请注意,我曾经io.Copy将数据从文件 (an io.Reader)复制到 tar 编写器 (an io.Writer)。对于较大的文件,这将工作得更好。另外 - 请特别注意文档中的此注释:因为 os.FileInfo 的 Name 方法只返回它描述的文件的基本名称,所以可能需要修改返回头的 Name 字段以提供文件的完整路径名。在这个简单的示例中,您只使用了sample.txt,因此您不会遇到麻烦。如果您想在 tar 中保留目录结构,则可能需要修改Name标题中的字段。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go