drhanjuw56233 2018-06-26 14:03
浏览 16
已采纳

ioutil.ReadAll为tar读取器提供0个字节

I create a tar file in memory:

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
", 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
}

But unable to convert this tar file to bytes. 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))

It just prints 0 bytes:

2018/06/26 16:57:04 main.go:67: read 0 bytes

But I can read the content of the tar, file by file:

for {
    hdr, err := tr.Next()
    if err == io.EOF {
        break // End of archive
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Contents of %s:
", hdr.Name)
    if _, err := io.Copy(os.Stdout, tr); err != nil {
        log.Fatal(err)
    }
    fmt.Println()
}

playground 2

It prints

Contents of 2.txt:
2
Contents of 1.txt:
11

as expected.

So it means that my tar file is not empty. I just need to convert it to bytes for further pushing to glcoud storage. But looks like I mess around with readers and writers and can hardly figure out how to convert tar to bytes in the memory.

  • 写回答

1条回答 默认 最新

  • doufuxing8562 2018-06-26 14:13
    关注

    The program writes the archive to a bytes.Buffer. Call Buffer.Bytes() to get the archive bytes.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据