Golang : Unzip file
Go's standard library provides support for several archive file formats. Zip format is the most common standard of compressing file. It is easy to unzip zip file in Go. Below is the code to unzip a zip file.
gounzip.go
package main
import (
"archive/zip"
"flag"
"fmt"
"io"
"os"
"path/filepath"
)
func main() {
flag.Parse() // get the arguments from command line
zipfile := flag.Arg(0)
if zipfile == "" {
fmt.Println("Usage : gounzip sourcefile.zip")
os.Exit(1)
}
reader, err := zip.OpenReader(zipfile)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer reader.Close()
for _, f := range reader.Reader.File {
zipped, err := f.Open()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer zipped.Close()
// get the individual file name and extract the current directory
path := filepath.Join("./", f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(path, f.Mode())
fmt.Println("Creating directory", path)
} else {
writer, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, f.Mode())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer writer.Close()
if _, err = io.Copy(writer, zipped); err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println("Decompressing : ", path)
}
}
}
Build the executable and
test out the
./gounzip somefile.zip
Sample out :
./gounzip v1.8.31.2-beta.zip
Creating directory ngx_pagespeed-1.8.31.2-beta
Decompressing : ngx_pagespeed-1.8.31.2-beta/.gitignore
Decompressing : ngx_pagespeed-1.8.31.2-beta/LICENSE
Decompressing : ngx_pagespeed-1.8.31.2-beta/README.md
Decompressing : ngx_pagespeed-1.8.31.2-beta/config
Decompressing : ngxpagespeed-1.8.31.2-beta/cppfeature
Creating directory ngx_pagespeed-1.8.31.2-beta/scripts
...
References:
See also : Golang : Zip file
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+8.1k Golang : What fmt.Println() can do and println() cannot do
+12.7k Golang : Get absolute path to binary for os.Exec function with exec.LookPath
+25.4k Golang : Storing cookies in http.CookieJar example
+10.9k PHP : Convert(cast) bigInt to string
+9.8k PHP : Get coordinates latitude/longitude from string
+6.1k Golang : Convert Chinese UTF8 characters to Pin Yin
+6.4k Golang : Extract sub-strings
+16.7k Golang : Delete files by extension
+16.4k Golang : convert string or integer to big.Int type
+6.3k Golang : Process non-XML/JSON formatted ASCII text file example
+20.6k nginx: [emerg] unknown directive "passenger_enabled"
+10.6k Golang : Simple Jawi(Yawi) to Rumi(Latin/Romanize) converter