package archive import ( "archive/tar" fp "path/filepath" "io" "os" ) type Unarchive struct { Input string inputFile *os.File tarReader *tar.Reader } // Extracts a tar arcive to the current working directory // This will overwrite everything. So be careful func (u *Unarchive) UnTar() error { var err error u.inputFile, err = os.Open(u.Input) if err != nil { return err } defer u.inputFile.Close() u.tarReader = tar.NewReader(u.inputFile) for { hdr, err := u.tarReader.Next() if err == io.EOF { // We've reached the end! Whoee break } if err != nil { return err } info := hdr.FileInfo() if info.IsDir() { if err = os.MkdirAll(hdr.Name, info.Mode()); err != nil { return err } continue } if err = os.MkdirAll(fp.Dir(hdr.Name), info.Mode()); err != nil { return err } // Create a file handle to work with // f, err := os.Create(hdr.Name) f, err := os.OpenFile(hdr.Name, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode()) if err != nil { return err } defer f.Close() if _, err := io.Copy(f, u.tarReader); err != nil { return err } } return nil }