我在内存中创建一个tar文件:
var buf bytes.Buffer
tw := tar.NewWriter(&buf)
files := map[string][]byte{
"1.txt": []byte("11"),
"2.txt": []byte("2"),
}
for fileName, bStr := range files {
b := []byte(bStr)
hdr := &tar.Header{
Name: fileName,
Mode: 0600,
Size: int64(len(b)),
}
log.Printf("include the file to the tar %+v\n", hdr)
if err := tw.WriteHeader(hdr); err != nil {
err := fmt.Errorf("couldn't write a header: %+v", err)
log.Println(err)
return
}
if _, err := tw.Write(b); err != nil {
err := fmt.Errorf("couldn't write file %+v to tar: %+v", fileName, err)
log.Println(err)
return
}
}
if err := tw.Close(); err != nil {
log.Println(err)
return
}
但是无法将此tar文件转换为字节。 playground 1
b, err := ioutil.ReadAll(tr)
if err != nil {
err = fmt.Errorf("could not read file data")
log.Println(err)
return
}
log.Printf("read %+v bytes", len(b))
它只打印0个字节:
2018/06/26 16:57:04 main.go:67: read 0 bytes
但是我可以逐文件读取tar的内容:
for {
hdr, err := tr.Next()
if err == io.EOF {
break // End of archive
}
if err != nil {
log.Fatal(err)
}
fmt.Printf("Contents of %s:\n", hdr.Name)
if _, err := io.Copy(os.Stdout, tr); err != nil {
log.Fatal(err)
}
fmt.Println()
}
它打印
Contents of 2.txt:
2
Contents of 1.txt:
11
符合预期。
所以这意味着我的tar文件不为空。我只需要将其转换为字节以进一步推送到glcoud存储即可。但是看起来我在和读者和作家打交道,几乎不知道如何将tar转换为内存中的字节。