在Go中解压缩tar包

时间:2014-11-01 18:12:53

标签: go

对于我编写的程序的一部分,我有一个解压缩包并返回其内容列表的函数。

除了提取的文件为空外,一切似乎都有效。我可以将文件内容解压缩到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
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

你没有刷新缓冲编写器的内容,因此如果文件足够小,你就不会写任何东西。在bufio.(*Writer).Flush()来电后,在某个地方拨打io.Copy()电话。

此外,您可能希望关闭循环中的输出文件,而不是推迟直到所有文件都已写入。