您的位置 首页 golang

go|用Go写一个zip解压脚本

用服务器自带的unzip命令解压zip包时,经常遇到编码问题,所以用Go写一个zip解压 脚本 来处理zip包

代码如下:

 package main

import (
"archive/zip"
"bytes"
"flag"
"fmt"
" io "
"io/ioutil"
"log"
"os"
"path/filepath"

"golang.org/x/text/encoding/simplifiedchinese"
" go lang.org/x/text/transform"
)

func unzip(zipFile string, destDir string) error {
zipReader, err := zip.OpenReader(zipFile)
if err != nil {
return err
}
defer zipReader. Close ()
var decodeName string
for _, f := range zipReader.File {
if f. Flags  == 0 {
i :=  byte s.NewReader([]byte(f.Name))
decoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())
content, _ := ioutil.ReadAll(decoder)
decodeName = string(content)
} else {
decodeName = f.Name
}

fpath := filepath.Join(destDir, decodeName)
if f.FileInfo().IsDir() {
os.MkdirAll(fpath, os.ModePerm)
} else {
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return err
}

inFile, err := f.Open()
if err != nil {
return err
}
defer inFile.Close()

outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
defer outFile.Close()

_, err = io.Copy(outFile, inFile)
if err != nil {
return err
}
}
}
return nil
}

var (
src string
dst string
)

func usage() {
fmt.Fprintf(os.Stderr, `gounzip version: gounzip/1.0
Usage:
gounzip --src='/mnt/a.zip' --dst='/ tmp '
gounzip --src '/mnt/a.zip' --dst '/tmp'
gounzip -src='/mnt/a.zip' -dst='/tmp'
gounzip -src '/mnt/a.zip' -dst '/tmp'

Options:
`)
flag.PrintDefaults()
}
func init() {
flag.StringVar(&src, "src", "", "zip file ")
flag.StringVar(&dst, "dst", "/tmp", "unzip dir")
flag.Usage = usage
flag.Parse()
}

func main() {
err := unzip(src, dst)
if err != nil {
log.Println(err)
}
}
  

编译后放到bin目录下

查看帮助:

这里命令行,简单实用了flag,可以用cobra库来替代,优化命令行

文章来源:智云一二三科技

文章标题:go|用Go写一个zip解压脚本

文章地址:https://www.zhihuclub.com/97569.shtml

关于作者: 智云科技

热门文章

网站地图