下面的代码尝试下载并解压缩tar.gz文件,然后在其中压缩二进制文件。解压缩似乎出错了,因为完成解压缩并且文件已存在之后,系统(Mac OS X)无法将该文件识别为二进制可执行文件。如果有人能帮助我确定这里出了什么问题,我将非常感谢。 这是代码
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(S3Bucket),
Key: aws.String(s3Key),
})
if err != nil { return err }
defer resp.Body.Close()
ExtractTarGz(resp.Body)
func ExtractTarGz(gzipStream io.Reader) {
uncompressedStream, err := gzip.NewReader(gzipStream)
if err != nil {
log.Fatal("ExtractTarGz: NewReader failed")
}
tarReader := tar.NewReader(uncompressedStream)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
}
switch header.Typeflag {
case tar.TypeDir:
if err := os.Mkdir(header.Name, 0755); err != nil {
log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
}
case tar.TypeReg:
outFile, err := os.Create(header.Name)
if err != nil {
log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
}
if _, err := io.Copy(outFile, tarReader); err != nil {
log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
}
outFile.Close()
default:
log.Fatalf(
"ExtractTarGz: uknown type: %s in %s",
header.Typeflag,
header.Name)
}
}
}
(使用Mac的Keka,从tar文件中正常解压缩文件效果很好,并且将解压缩后的文件识别为二进制文件。我已经检查了文件大小,该文件大小与预期的二进制文件相同。 )