对于我编写的程序的一部分,我有一个解压缩包并返回其内容列表的函数。
除了提取的文件为空外,一切似乎都有效。我可以将文件内容解压缩到stdout并看到它确实提供了正确的内容,只是不确定它为什么不写入文件。
功能:
func UnpackTarball(filename, extractpath string) ([]string, error) {
buf, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
if err = os.MkdirAll(extractpath, os.ModeDir|0755); err != nil {
return nil, err
}
tarball := tar.NewReader(bytes.NewReader(buf))
contentlist := make([]string, 0, 500)
// Iterate through the files in the archive
for {
hdr, err := tarball.Next()
if err == io.EOF {
// end of tar archive
break
}
if err != nil {
return nil, err
}
info := hdr.FileInfo()
entry := path.Join(extractpath, hdr.Name)
// Is entry a directory?
if info.IsDir() {
if err = os.MkdirAll(entry, os.ModeDir|0755); err != nil {
return nil, err
}
continue
}
// Append entry to the content list
contentlist = append(contentlist, hdr.Name)
// Create file
f, err := os.Create(entry)
if err != nil {
return nil, err
}
defer f.Close()
_, err = io.Copy(bufio.NewWriter(f), tarball)
//_, err = io.Copy(os.Stdout, tarball)
if err != nil {
return nil, err
}
}
return contentlist, nil
}
感谢您的帮助。
答案 0 :(得分:3)
你没有刷新缓冲编写器的内容,因此如果文件足够小,你就不会写任何东西。在bufio.(*Writer).Flush()
来电后,在某个地方拨打io.Copy()
电话。
此外,您可能希望关闭循环中的输出文件,而不是推迟直到所有文件都已写入。