如何从 gzip 存档中的文件流式传输数据,以便测试标头?

我正在尝试在 Go 中编写一个提取工具,它将解压缩/提取几种类型的存档文件。为了检查文件的类型,我使用了幻数,并且已经成功地直接检查.gz和.tar归档,但是对于任何.tar.gz/.tgz归档,我似乎无法检查 Gzip 包中的 tar 文件。


我目前的思路是,我需要获取输出gzip.NewReader(f)并拉动其输出的标题,但这不起作用。


f, err := os.Open(file)

if err != null {

  return fmt.Errorf("problem opening %s", filename)

}

r, _ := gzip.NewReader(f)

h, err := GetHeader(r, l)

这里,GetHeader是...


func GetHeader(r io.Reader, l uint32) (in []byte, err error) {

    fmt.Println("Here C")

    in = make([]byte, l)

    n := 0

    n, err = io.ReadFull(r, in)

    if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {

        fmt.Println("Here D")

        return nil, err

    }

    fmt.Println(n)

    in = in[:n]

    return in, nil

}

它用于成功地自行检查 Gzip 和 Tar 存档,总而言之,l设置为uint32 3072.


我只能假设我在这里遗漏了一些非常微不足道的东西,但此刻我不知所措。


如果有人可以帮助我解决这个问题,将不胜感激。


呼如林
浏览 120回答 1
1回答

Smart猫小萌

它应该是h, err := GetHeader(r, l)代替h, err := GetHeader(f, l)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go