1 回答
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标题中的字段。
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报