gpt4 book ai didi

go - 在 Go 中解压压缩包

转载 作者:IT王子 更新时间:2023-10-29 01:39:47 25 4
gpt4 key购买 nike

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

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

感谢您的帮助。

最佳答案

您没有刷新缓冲写入器的内容,因此如果文件足够小,您就不会写入任何内容。在 io.Copy() 调用之后的某处调用 bufio.(*Writer).Flush()

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

关于go - 在 Go 中解压压缩包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26691458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com