将解压缩的tar.gz复制到单个文件

PiKaY:

我正在尝试将tar.gz的提取内容复制到go lang中的单个文件中。我将在文件内只有文本。

以下是我当前的代码。

f, err := os.Open(fullpath)
if err != nil {
    log.Panicf("Can not open file %s: %v", fullpath, err)
    return ""
}
defer f.Close()
reader, err := gzip.NewReader(f)
if err != nil{
    log.Panicf("Cannot read gzip archive %v", err);
    return ""
}
defer reader.Close()
tar_reader := tar.NewReader(reader)
var files []io.Reader
for{
    header, err := tar_reader.Next()
    if err == io.EOF {
        break
    } else if err != nil {
        log.Panicf("Cannot read file inside tarball %v", err);
        return 0, err
    } else {
        log.Println("Parsing file : ", header.Name)
        files = append(files, tar_reader)
    }
}
reader = io.MultiReader(files...)
writer, err := os.Create(target)
if err != nil {
    log.Panicf("Cannot write unarchived file %v", err);
    return 0, err
}
defer writer.Close()

result,err := io.Copy(writer, reader)
if(err != nil) {
    log.Panicf("Cannot write unarchived file %v", err);
}
return result,err

虽然上面的代码没有任何错误,但文件并未被读取。输出无数据。请指出我要去哪里。

吉姆:

您将tar.Reader一遍又一遍地添加到files切片。阅读标头后,必须从存档中读取文件。只需复制文件即可。您可能也应该检查常规文件,目录,符号链接等。

copied := 0
for {
    header, err := tar_reader.Next()
    if err == io.EOF {
        break
    } else if err != nil {
        log.Fatalf("Cannot read file inside tarball %v", err)
    }

    if !(header.Typeflag == tar.TypeReg || header.Typeflag == tar.TypeRegA) {
        continue
    }


    n, err = io.Copy(writer, tar_reader)
    if err != nil {
        log.Fatalf("Cannot write unarchived file %v", err)
    }
    copied += n
}
return copied, nil

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章