1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| func Extract(buffer io.Reader, targetDir string) error { uncompressedStream, err := gzip.NewReader(buffer) if err != nil { return err }
if err := os.MkdirAll(targetDir, 0755); err != nil { return err }
tarReader := tar.NewReader(uncompressedStream) for { header, err := tarReader.Next() if err == io.EOF { break } if err != nil { return err }
path, err := cleanJoin(targetDir, header.Name) if err != nil { return err }
switch header.Typeflag { case tar.TypeDir: if err := os.Mkdir(path, 0755); err != nil { return err } case tar.TypeReg: outFile, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) if err != nil { return err } if _, err := io.Copy(outFile, tarReader); err != nil { outFile.Close() return err } outFile.Close() case tar.TypeXGlobalHeader, tar.TypeXHeader: continue default: return errors.Errorf("unknown type: %b in %s", header.Typeflag, header.Name) } } return nil }
|