| 997 | } |
| 998 | |
| 999 | func (m *Book) zip(dir, zipFile string) (err error) { |
| 1000 | // zip 压缩 |
| 1001 | |
| 1002 | var ( |
| 1003 | d *os.File |
| 1004 | fw io.Writer |
| 1005 | fcont []byte |
| 1006 | fl []filetil.FileList |
| 1007 | ) |
| 1008 | |
| 1009 | if fl, err = filetil.ScanFiles(dir); err != nil { |
| 1010 | return |
| 1011 | } |
| 1012 | |
| 1013 | os.Remove(zipFile) |
| 1014 | d, err = os.Create(zipFile) |
| 1015 | if err != nil { |
| 1016 | beego.Error(err) |
| 1017 | return |
| 1018 | } |
| 1019 | defer d.Close() |
| 1020 | zipWriter := zip.NewWriter(d) |
| 1021 | defer zipWriter.Close() |
| 1022 | |
| 1023 | for _, file := range fl { |
| 1024 | if file.IsDir { |
| 1025 | continue |
| 1026 | } |
| 1027 | |
| 1028 | info, errInfo := os.Stat(file.Path) |
| 1029 | if errInfo != nil { |
| 1030 | beego.Error(errInfo) |
| 1031 | continue |
| 1032 | } |
| 1033 | |
| 1034 | header, errHeader := zip.FileInfoHeader(info) |
| 1035 | if errHeader != nil { |
| 1036 | beego.Error(errHeader) |
| 1037 | continue |
| 1038 | } |
| 1039 | |
| 1040 | header.Method = zip.Deflate |
| 1041 | header.Name = strings.TrimLeft(strings.TrimPrefix(strings.ReplaceAll(file.Path, "\\", "/"), dir), "./") |
| 1042 | |
| 1043 | fw, err = zipWriter.CreateHeader(header) |
| 1044 | if err != nil { |
| 1045 | beego.Error(err) |
| 1046 | return |
| 1047 | } |
| 1048 | |
| 1049 | fcont, err = ioutil.ReadFile(file.Path) |
| 1050 | if err != nil { |
| 1051 | return |
| 1052 | } |
| 1053 | |
| 1054 | if _, err = fw.Write(fcont); err != nil { |
| 1055 | return |
| 1056 | } |