go - golang tar。读取截断数据

标签 go tar

我在使用golang tar库提取tar存档时遇到问题。 header 读取正确的大小,并且我的缓冲区大小相同,但是当我调用tar.Read时,我没有在缓冲区中获取所有数据。我不知道为什么会这样。
压缩包最多包含4个文件,而且似乎已被切断了thermostat.csv文件。
当我使用bash提取文件时,它们干净整齐,因此,我很确定tarball没什么问题。

package main

import (
    "archive/tar"
    "compress/gzip"
    "os"
    "io"
    "io/ioutil"
    "fmt"
)

func main() {
    var filename string
    //untar each file
    filename = "/tmp/6yHYKND3t0"
    f,err := os.Open(filename)
    if err != nil {
        panic("cant open file")
    }
    defer f.Close()
    gzf,err := gzip.NewReader(f)
    check(err)
    tarReader := tar.NewReader(gzf)
    for {
        header,err := tarReader.Next()
        if err == io.EOF {
            break
        }
        check(err)
        name := header.Name
        switch header.Typeflag {
            case tar.TypeDir:
                os.Mkdir("/tmp/enTest/"+name,0755)
            case tar.TypeReg:
                data := make([]byte,header.Size)
                fmt.Printf("Header Size: %d\n",header.Size)
                l,err := tarReader.Read(data)
                fmt.Printf("Length of buffer: %d\n", len(data))
                fmt.Printf("Read from tar.Read: %d\n",l)
                check(err)
                outputFile := "/tmp/enTest/"+name
                fmt.Println("Writing file to :",outputFile)
                ioutil.WriteFile(outputFile,data,0755)
            default:
                fmt.Println("Unknown type %c %s\n",header.Typeflag,name)
                panic(err)
        }
    }
}

func check(err error) {
    if err != nil {
        panic(err)
    }
}
输出以下内容:
Header Size: 47537370
Length of buffer: 47537370
Read from tar.Read: 31744
Writing file to : /tmp/enTest/d2af74605ac45cf6b19c068d2d8e2710/thermostats.csv
Header Size: 34038106
Length of buffer: 34038106
Read from tar.Read: 7168
Writing file to : /tmp/enTest/d2af74605ac45cf6b19c068d2d8e2710/energy-monitors.csv
Header Size: 72965
Length of buffer: 72965
Read from tar.Read: 14336
Writing file to : /tmp/enTest/d2af74605ac45cf6b19c068d2d8e2710/lights.csv
Header Size: 7158655
Length of buffer: 7158655
Read from tar.Read: 6144
Writing file to : /tmp/enTest/d2af74605ac45cf6b19c068d2d8e2710/remote-sensors.csv
Header Size: 1732617
Length of buffer: 1732617
Read from tar.Read: 23040
Writing file to : /tmp/enTest/d2af74605ac45cf6b19c068d2d8e2710/hvac-controllers.cs
v

最佳答案

io.Reader documentation说:

Read reads up to len(p) bytes into p. It returns the number of bytes read (0 <= n <= len(p)) and any error encountered. ... If some data is available but not len(p) bytes, Read conventionally returns what is available instead of waiting for more.


不能保证读取会填充数据参数。使用io.ReadFull填充缓冲区。
l,err := io.ReadFull(tarReader, data)

关于go - golang tar。读取截断数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62647328/

相关文章:

python - 使用 Python 的 'tarfile' ,如何获取 tar 存档中的最顶层目录?

maven-dependency-plugin unpack-dependencies 不支持包含超过 100 个字符的路径的 tar

Linux 使用 tar 和 if else 判断是否有文件

go - 如何在 Ubuntu 的 go 1.11 中设置 GOPATH 环境变量?我必须编辑什么文件?

json - Go 能够解码为 map[string][]interface{} 吗?

http - golang 和 ListenAndServeTLS 返回错误

linux - 修改 tar 存档中嵌套的文件

golang 时区夏令时不起作用

go - 指针和 protobuf 的无法解释的行为

java - 使用Java运行 "tar"命令,但生成tar文件需要花费大量时间