/
file.go
191 lines (173 loc) · 3.68 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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package common
import (
"archive/zip"
"crypto/md5"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"strings"
)
// 剪切文件
func CutFile(dstName, srcName string) error {
// 先删除再cut
os.Remove(dstName)
src, err := os.Open(srcName)
if err != nil {
return err
}
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, src)
src.Close()
if err == nil {
err = os.Remove(srcName)
}
return err
}
// 复制文件
func CopyFile(dstName, srcName string) error {
// 先删除再copy
os.Remove(dstName)
src, err := os.Open(srcName)
if err != nil {
return err
}
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, src)
src.Close()
return err
}
// 文件是否存在
func Isfile(filename string) bool {
_, err := os.Stat(filename)
if err != nil && os.IsNotExist(err) {
return false
}
return true
}
// 获取文件md5的hex编码
func Md5FileHex(filePath string) string {
file, err := os.Open(filePath)
if err != nil {
return "00000000000000000000000000000000"
}
defer file.Close()
w := md5.New()
if _, err = io.Copy(w, file); err != nil {
return "00000000000000000000000000000000"
}
strMd5 := fmt.Sprintf("%x", w.Sum(nil))
return strMd5
}
// 文件文件或文件夹是否存在
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
// 创建文件夹,文件夹如果存在 直接返回
func MakePath(filePath string) error {
ok, err := PathExists(filePath)
if err != nil {
return err
}
if !ok {
err = os.MkdirAll(filePath, os.ModePerm)
if err != nil {
return err
}
}
return nil
}
// 解压zip文件
func Unzip(zipFile string, destDir string) error {
zipReader, err := zip.OpenReader(zipFile)
if err != nil {
return err
}
defer zipReader.Close()
for _, f := range zipReader.File {
fpath := filepath.Join(destDir, f.Name)
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
}
// 获取纯净文件名 用于保存到磁盘本地
func PureFilename(name string) string {
reg := regexp.MustCompile(`[/|?|*|:|\||\\|<|>|&|#|@|$|(|)|;|'|"|%]+`)
return reg.ReplaceAllString(name, "")
}
// 异或加密
func Xor(data, key []byte) []byte {
var result []byte
for i := 0; i < len(data); i++ {
result = append(result, data[i]^key[0])
}
return result
}
// 遍历文件
func GetAllFile(pathname string, whiteExt ...string) ([]string, error) {
filePaths := make([]string, 0)
rd, err := ioutil.ReadDir(pathname)
if err != nil {
return filePaths, err
}
for _, fi := range rd {
// 不是文件夹
if !fi.IsDir() {
// 过滤后缀
_ext := strings.ToLower(filepath.Ext(fi.Name()))
// 扫描白名单
for _, ext := range whiteExt {
if _ext == strings.ToLower(ext) {
// 白名单内的加入队列
filePaths = append(filePaths, filepath.Join(pathname, fi.Name()))
break
}
}
continue
}
// 文件夹
resp, err := GetAllFile(filepath.Join(pathname, fi.Name()), whiteExt...)
if err != nil {
return filePaths, err
}
filePaths = append(filePaths, resp...)
}
return filePaths, nil
}