将提取的tar.gz复制到单个文件中

时间:2016-10-28 14:19:48

标签: go tar glow

我正在尝试将提取的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

虽然我没有收到上述代码的任何错误,但是文件没有被读取。输出没有数据。请指出我出错的地方。

1 个答案:

答案 0 :(得分:2)

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

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