Skip to content

Instantly share code, notes, and snippets.

@Komosa
Last active January 5, 2016 13:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Komosa/fee184cb83ef999f5018 to your computer and use it in GitHub Desktop.
Save Komosa/fee184cb83ef999f5018 to your computer and use it in GitHub Desktop.
unzip (missing functionality of windows)
package main
import (
"archive/zip"
"errors"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
)
func main() {
if len(os.Args) <= 1 {
fmt.Println("usage: unzip file.zip [file2.zip, ...]")
os.Exit(78)
}
for _, arg := range os.Args[1:] {
err := unzip(arg)
if err != nil {
log.Fatal(err)
}
}
}
func unzip(archive string) error {
reader, err := zip.OpenReader(archive)
if err != nil {
return err
}
defer reader.Close()
target := filepath.Base(archive)
if !strings.HasSuffix(target, ".zip") || len(target) <= 4 {
return errors.New("not a zip fileNAME")
}
target = target[:len(target)-4]
if err := os.MkdirAll(target, 0755); err != nil {
return err
}
for _, file := range reader.File {
path := filepath.Join(target, file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(path, file.Mode())
continue
}
fileReader, err := file.Open()
if err != nil {
return err
}
defer fileReader.Close()
targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
if err != nil {
return err
}
defer targetFile.Close()
if _, err := io.Copy(targetFile, fileReader); err != nil {
return err
}
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment