gpt4 book ai didi

戈朗 : file extracted from tar throws permissions error

转载 作者:IT王子 更新时间:2023-10-29 01:59:35 26 4
gpt4 key购买 nike

我已经编写了以下代码来对文件进行压缩,代码可以正常工作,但奇怪的是,如果我解压缩存档,文件权限就会消失,所以我无法读取它,除非我随后对文件进行 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)
}

}

知道我做错了什么吗?

最佳答案

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

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 将文件(io.Reader)中的数据复制到 tar 编写器(io.Writer)。这对于较大的文件会更好。

另外 - 请特别注意文档中的这条注释:

Because os.FileInfo's Name method returns only the base name of the file it describes, it may be necessary to modify the Name field of the returned header to provide the full path name of the file.

在这个简单的示例中,您只是在使用 sample.txt,因此您应该不会遇到麻烦。如果您想在您的 tar 中保留目录结构,您可能需要修改 header 中的 Name 字段。

关于戈朗 : file extracted from tar throws permissions error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com