将提取的 tar.gz 复制到单个文件
Copying extracted tar.gz to a single file
我正在尝试将 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
切片。阅读 header 后,您必须从存档中读取文件。只需复制文件即可。您可能也应该检查常规文件、目录、符号链接等。
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
我正在尝试将 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
切片。阅读 header 后,您必须从存档中读取文件。只需复制文件即可。您可能也应该检查常规文件、目录、符号链接等。
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