2014-11-01 123 views
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 
} 

感謝您的幫助。

+0

即使直接將'io.Copy'改爲'f',這種情況是否會發生? – nemo 2014-11-01 18:18:22

+0

@nemo工作!作爲一個Golang noob,心靈解釋爲什麼沒有作家的作品? – dangeroushobo 2014-11-01 18:29:33

+0

@dangeroushobo IO在Go中默認無緩衝。 'bufio.Writer'在上面放置一個緩衝區,但是由於緩衝的工作原理,你需要在完成後清空緩衝區。 – fuz 2014-11-01 18:41:25

回答

3

您不會沖洗緩衝寫入器的內容,因此如果文件足夠小,則不會寫入任何內容。致電bufio.(*Writer).Flush()致電io.Copy()後致電。

此外,您可能希望關閉循環中的輸出文件,而不是延遲直到寫入所有文件。