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

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

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

Go
叮当猫咪 2021-09-13 16:47:22
我已经编写了以下代码来对文件进行 tar 处理,代码可以工作,但奇怪的是,如果我解压归档文件,文件权限就会消失,因此除非我对文件进行 chmod 处理,否则我无法读取它: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)    }    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)    }}知道我做错了什么吗?
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

您没有保留文件的原始权限。您正在手动创建标题,并仅指定名称和大小。相反,用于tar.FileInfoHeader构建标题。


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)

    }

    // 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标题中的字段。


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

添加回答

举报

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