/
file.go
117 lines (101 loc) · 2.4 KB
/
file.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package utils
import (
"archive/zip"
"io"
"os"
"path/filepath"
"reflect"
"strings"
)
var File = new(file)
type file struct{}
// TrimSpace 去除结构体空格(目标结构体,传入必须是指针类型)
func (f *file) TrimSpace(target interface{}) {
t := reflect.TypeOf(target)
if t.Kind() != reflect.Ptr {
return
}
t = t.Elem()
v := reflect.ValueOf(target).Elem()
for i := 0; i < t.NumField(); i++ {
switch v.Field(i).Kind() {
case reflect.String:
v.Field(i).SetString(strings.TrimSpace(v.Field(i).String()))
}
}
}
// Move 文件移动 src: 源位置,绝对路径or相对路径, dst: 目标位置,绝对路径or相对路径,必须为文件夹
func (f *file) Move(src string, dst string) error {
var err error
if dst == "" || src == "" {
return nil
}
if src, err = filepath.Abs(src); err != nil {
return err
}
if dst, err = filepath.Abs(dst); err != nil {
return err
}
var revoke bool
dir := filepath.Dir(dst)
Redirect:
_, err = os.Stat(dir)
if err != nil {
if err = os.MkdirAll(dir, 0o755); err != nil {
return err
}
if !revoke {
revoke = true
goto Redirect
}
}
return os.Rename(src, dst)
}
// ZipFiles
func (f *file) ZipFiles(filename string, files []string, oldForm, newForm string) error {
newZipFile, err := os.Create(filename)
if err != nil {
return err
}
defer func() {
_ = newZipFile.Close()
}()
zipWriter := zip.NewWriter(newZipFile)
defer func() {
_ = zipWriter.Close()
}()
for _, file := range files {
err = func(file string) error {
zipFile, openErr := os.Open(file)
if openErr != nil {
return openErr
}
defer func() { _ = zipFile.Close() }()
info, statErr := zipFile.Stat() // 获取file的基础信息
if statErr != nil {
return statErr
}
header, HeaderErr := zip.FileInfoHeader(info)
if HeaderErr != nil {
return HeaderErr
}
// 使用上面的FileInfoHeader() 就可以把文件保存的路径替换成我们自己想要的了,如下面
header.Name = strings.Replace(file, oldForm, newForm, -1)
// 优化压缩
// 更多参考see http://golang.org/pkg/archive/zip/#pkg-constants
header.Method = zip.Deflate
writer, CreateErr := zipWriter.CreateHeader(header)
if CreateErr != nil {
return CreateErr
}
if _, err = io.Copy(writer, zipFile); err != nil {
return err
}
return nil
}(file)
if err != nil {
return err
}
} // 把files添加到zip中
return nil
}