我正在尝试将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] 删除。
我来说两句