我按以下方式处理
bf, err := os.Open(backupFilePath)
if err != nil {
fmt.Println("os.Open: ", err)
return
}
defer bf.Close()
rd := bufio.NewReader(bf)
tarFile, err := os.Create(tarFilePath)
if err != nil {
fmt.Println("os.Create: ", err)
return
}
defer tarFile.Close()
zf, zerr := zlib.NewReader(rd)
if zerr != nil {
return "", zerr
}
_, err = io.Copy(tarFile, zf)
if err != nil {
fmt.Println("io.Copy backup.ab -> backup.ab.tar failed: ", err)
}
zf.Close()
发生错误:io.Copy backup.ab -> backup.ab.tar failed: Unexpected EOF
出现这种情况是因为 .ab 文件已损坏还是处理方式错误?
很有可能是.ab文件损坏了
但是你的代码也有问题。从 .ab 文件读取时,您应该跳过前 24 个字节。否则,您应该会看到此错误:
zlib: invalid header
。由于您看到了其他内容,我认为您的 .ab 文件已损坏。
顺便说一句,不需要
rd := bufio.NewReader(bf)
。
这是适合我的演示:
package main
import (
"compress/zlib"
"io"
"os"
)
func main() {
bf, err := os.Open("temp.ab")
if err != nil {
panic(err)
}
defer bf.Close()
if _, err := bf.Seek(24, 0); err != nil {
panic(err)
}
zf, err := zlib.NewReader(bf)
if err != nil {
panic(err)
}
defer zf.Close()
tarFile, err := os.Create("temp.tar")
if err != nil {
panic(err)
}
defer tarFile.Close()
_, err = io.Copy(tarFile, zf)
if err != nil {
panic(err)
}
}
更新:
用backup.ab测试了demo,没有报错。但是生成的tar文件无效:
$ tar tvf backup.tar
<...list of files truncated...>
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
用
zlib-flate
试过,得到相同的结果:
$ dd if=backup.ab ibs=24 skip=1 | zlib-flate -uncompress > backup2.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72 backup2.tar
3eff01578dec035367688e03b6ec7a72 backup.tar