2
對於我正在編寫的程序的一部分,我有一個解壓縮tar包並返回其內容列表的功能。在Go中解壓縮包
除了提取的文件都是空的,一切似乎都起作用。我可以將文件內容提取到標準輸出,並看到它提供了正確的內容,只是不確定爲什麼不寫入文件。
功能:
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'改爲'f',這種情況是否會發生? – nemo 2014-11-01 18:18:22
@nemo工作!作爲一個Golang noob,心靈解釋爲什麼沒有作家的作品? – dangeroushobo 2014-11-01 18:29:33
@dangeroushobo IO在Go中默認無緩衝。 'bufio.Writer'在上面放置一個緩衝區,但是由於緩衝的工作原理,你需要在完成後清空緩衝區。 – fuz 2014-11-01 18:41:25