Share & grow the world's code base!

Delve into a community where programmers unite to discover code snippets, exchange skills, and enhance their programming proficiency. With abundant resources and a supportive community, you'll find everything essential for your growth and success.

1 snippets
  • Decompress tag.gz file in Go

    package main
    
    import (
    	"archive/tar"
    	"compress/gzip"
    	"fmt"
    	"io"
    	"os"
    	"path/filepath"
    
    	"github.com/unknwon/com"
    )
    
    func ExtractTarGz(file, folder string) error {
    	// open specified file
    	gzipStream, err := os.Open(file)
    
    	if err != nil {
    		return err
    	}
    
    	// create uncompressed stream reader
    	uncompressedStream, err := gzip.NewReader(gzipStream)
    
    	if err != nil {
    		return fmt.Errorf("could not create new targz reader: %v", err)
    	}
    
    	// create tar reader
    	tarReader := tar.NewReader(uncompressedStream)
    
    	for {
    		// read archive header
    		header, err := tarReader.Next()
    
    		if err == io.EOF {
    			break
    		}
    
    		if err != nil {
    			return fmt.Errorf("could not read next entry: %v", err)
    		}
    
    		destPath := filepath.Join(folder, header.Name)
    
    		switch header.Typeflag {
    		case tar.TypeDir:
    			// if a directory already exists skip its creation
    			if com.IsDir(destPath) {
    				continue
    			}
    
    			if err := os.Mkdir(destPath, 0755); err != nil {
    				return fmt.Errorf("could not create directory '%s': %v", destPath, err)
    			}
    		case tar.TypeReg:
    			// if a file already exists skip its creation
    			if com.IsFile(destPath) {
    				continue
    			}
    
    			outFile, err := os.Create(destPath)
    
    			if err != nil {
    				return fmt.Errorf("could not create file '%s': %v", destPath, err)
    			}
    
    			if _, err := io.Copy(outFile, tarReader); err != nil {
    				return fmt.Errorf("could not copy entry '%s': %v", destPath, err)
    			}
    
    			outFile.Close()
    		default:
    			return fmt.Errorf("uknown type: %s in %s", string(header.Typeflag), destPath)
    		}
    	}
    
    	return nil
    }
    
    func main() {
        err := ExtractTarGz("example.tar.gz", "/tmp")
    
        if err != nil {
            panic(err)
        }
    }

    An example of unpacking a tar.gz archive into the specified directory in Go.