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

问题描述:

I am trying to copy the extracted content of a tar.gz to a single file in go lang. I will have only text inside the files.

The following is my current code.

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

While I am not getting any error with the above code, the files are just not read. The output has no data. Please point me on where I am going wrong.

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

以下是我当前的代码。 p>

  f,err:= os.Open(  fullpath)
if err!= nil {
 log.Panicf(“无法打开文件%s:%v”,fullpath,err)
返回“” 
} 
defer f.Close()
reader,err  := gzip.NewReader(f)
if err!= nil {
 log.Panicf(“无法读取gzip存档%v”,err); 
返回“” 
} 
defer reader.Close()
tar_reader  := tar.NewReader(阅读器)
var文件[] io.Reader 
for {
标头,错误err == tar_reader.Next()
如果err == io.EOF {
 break 
}否则,如果错误 != nil {
 log.Panicf(“无法在tarball%v中读取文件”,err); 
返回0,err 
}否则{
 log.Println(“正在分析文件:”,header.Name)  
文件= append(文件,tar_reader)
} 
} 
reader = io.MultiReader(文件...)
writer,err:= os.Create(target)
if err!= nil {
 log  .Panicf(“无法写入未归档的文件%v”,err); 
返回0,err 
} 
defer writer.Close()
 
result,err:= io.Copy(writer,reader)
if( 错误!=  nil){
 log.Panicf(“无法写入未归档的文件%v”,err); 
} 
返回结果,err 
  code>  pre> 
 
 

但我不是 如果上面的代码有任何错误,则不会读取文件。 输出没有数据。 请指出我要去哪里。 p> div>

You're appending the same tar.Reader over and over to the files slice. You have to read the file from the archive after you read the header. Just copy the files at that point. You probably should check for regular files too, vs directories, symlinks, etc.

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