package archive import ( "archive/tar" fp "path/filepath" "compress/gzip" "io" "os" ) type Unarchive struct { Input string tarReader *tar.Reader } // Extracts a tar arcive to the current working directory // This will overwrite everything. So be careful func (u *Unarchive) UnTar(compressionType string) error { f, err := os.Open(u.Input) if err != nil { return err } defer f.Close() var treader *tar.Reader switch compressionType { case "gz": gzreader, err := gzip.NewReader(f) if err != nil { return err } // Read from the gzip reader instead of the file treader = tar.NewReader(gzreader) default: // Read from the file directly treader = tar.NewReader(f) } for { hdr, err := treader.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, treader); err != nil { return err } } return nil }