@@ -11,7 +11,6 @@ import (
1111 "os"
1212 "path/filepath"
1313
14- "golang.org/x/text/encoding/simplifiedchinese"
1514 "golang.org/x/text/transform"
1615)
1716
@@ -47,35 +46,36 @@ func init() {
4746}
4847
4948func main () {
50- flag .Parse () // 解析参数
51-
52- fmt .Println ("PPPP:" , zipPath , distDirPath , mode , srcFiles )
53-
49+ flag .Parse ()
5450 if mode == UNZIP_MODE {
55- fmt .Println ("UNZIP:" , zipPath , "-->" , distDirPath )
56- UnZip (distDirPath , zipPath )
51+ fmt .Println ("UNZIP:" , zipPath , "-->" , distDirPath , "code:" , encode )
52+ err := UnZip (distDirPath , zipPath )
53+ if err != nil {
54+ fmt .Println (err )
55+ os .Exit (- 3 )
56+ }
5757 return
5858 }
5959 if mode == ZIP_MODE {
60- fmt .Println ("ZIP:" , srcFiles , "-->" + zipPath )
61- Zip (srcFiles , zipPath )
60+ fmt .Println ("ZIP:" , srcFiles , "-->" , zipPath , "code:" , encode )
61+ err := Zip (srcFiles , zipPath )
62+ if err != nil {
63+ fmt .Println (err )
64+ os .Exit (- 2 )
65+ }
6266 return
6367 }
64-
65- fmt .Println ("ERR Params!" )
68+ fmt .Println ("Err Mode Params!" )
6669 os .Exit (- 1 )
6770}
6871
69- // 压缩文件
70- // files 文件数组,可以是不同dir下的文件或者文件夹
71- // dest 压缩文件存放地址
7272func Zip (srcFiles []string , dest string ) error {
7373 var files []* os.File
7474 for _ , fileName := range srcFiles {
7575 file , err := os .Open (fileName )
7676 if err != nil {
7777 log .Fatalln (err )
78- os . Exit ( - 4 )
78+ return err
7979 }
8080 files = append (files , file )
8181 }
@@ -92,96 +92,44 @@ func Zip(srcFiles []string, dest string) error {
9292 return nil
9393}
9494
95- func fileToZipWriter ( file * os. File , prefix string , zw * zip. Writer ) error {
96- info , err := file . Stat ( )
95+ func UnZip ( distDirPath , zipPath string ) error {
96+ zipFile , err := zip . OpenReader ( zipPath )
9797 if err != nil {
9898 return err
9999 }
100- if info .IsDir () {
101- if prefix == "" {
102- prefix = info .Name ()
103- } else {
104- prefix = prefix + "/" + info .Name ()
105- }
106-
107- fileInfos , err := file .Readdir (- 1 )
108- if err != nil {
109- return err
110- }
111- for _ , fi := range fileInfos {
112- f , err := os .Open (file .Name () + "/" + fi .Name ())
113- if err != nil {
114- return err
115- }
116- err = fileToZipWriter (f , prefix , zw )
117- if err != nil {
118- return err
119- }
120- }
121- } else {
122- header , err := zip .FileInfoHeader (info )
123- if prefix != "" {
124- header .Name = prefix + "/" + header .Name
125- }
126- if err != nil {
127- return err
128- }
129- writer , err := zw .CreateHeader (header )
130- if err != nil {
131- return err
132- }
133- _ , err = io .Copy (writer , file )
134- file .Close ()
135- if err != nil {
136- return err
137- }
138- }
139- return nil
140- }
141100
142- func UnZip (distDirPath , zipPath string ) {
143- zipFile , err := zip .OpenReader (zipPath )
144- if err != nil {
145- panic (err )
146- }
147101 defer zipFile .Close ()
148102
149103 prefix := ""
150104 if distDirPath != "" && distDirPath != "." {
151105 prefix = distDirPath + "/"
152106 }
153107
154- // 第二步,遍历 zip 中的文件
155108 for _ , f := range zipFile .File {
156- filePath := f .Name
157- if encode == "gbk" {
158- i := bytes .NewReader ([]byte (f .Name ))
159- decoder := transform .NewReader (i , simplifiedchinese .GB18030 .NewDecoder ())
160- content , _ := ioutil .ReadAll (decoder )
161- filePath = string (content )
162- }
109+ nameReader := bytes .NewReader ([]byte (f .Name ))
110+ decoder := transform .NewReader (nameReader , getDecoderByCoder (encode ))
111+ content , _ := ioutil .ReadAll (decoder )
112+ filePath := string (content )
163113 if f .FileInfo ().IsDir () {
164114 _ = os .MkdirAll (prefix + filePath , os .ModePerm )
165115 continue
166116 }
167- // 创建对应文件夹
168117 if err := os .MkdirAll (prefix + filepath .Dir (filePath ), os .ModePerm ); err != nil {
169- panic ( err )
118+ return err
170119 }
171- // 解压到的目标文件
172120 dstFile , err := os .OpenFile (prefix + filePath , os .O_WRONLY | os .O_CREATE | os .O_TRUNC , f .Mode ())
173121 if err != nil {
174- panic ( err )
122+ return err
175123 }
176124 file , err := f .Open ()
177125 if err != nil {
178- panic ( err )
126+ return err
179127 }
180- // 写入到解压到的目标文件
181128 if _ , err := io .Copy (dstFile , file ); err != nil {
182- panic ( err )
129+ return err
183130 }
184131 dstFile .Close ()
185132 file .Close ()
186133 }
134+ return nil
187135}
0 commit comments