/
file.go
95 lines (81 loc) · 1.65 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
package utils
import (
"crypto/md5"
"fmt"
"io"
"math"
"os"
"path"
)
const filechunk = 8192
func FilePathExists(path string) bool {
_, err := os.Stat(path)
if err != nil {
if os.IsExist(err) {
return true
}
return false
}
return true
}
func GetFileModifyTime(fileName string) int64 {
info, err := os.Stat(fileName)
if err != nil {
return -1
}
return info.ModTime().Unix()
}
func GetFileSize(fileName string) int64 {
info, err := os.Stat(fileName)
if err != nil {
return -1
}
return info.Size()
}
func CopyFile(src, dst string) (int64, error) {
source, err := os.Open(src)
if err != nil {
return 0, err
}
defer source.Close()
destination, err := os.Create(dst)
if err != nil {
return 0, err
}
defer destination.Close()
nBytes, err := io.Copy(destination, source)
return nBytes, err
}
func ListDir(dir string) ([]string, error) {
if len(dir) == 0 {
return nil, fmt.Errorf("dir: %s error", dir)
}
files, err := os.ReadDir(dir)
if err != nil {
return nil, err
}
ret := make([]string, 0, len(files))
for _, f := range files {
ret = append(ret, path.Join(dir, f.Name()))
}
return ret, nil
}
func GetMD5(filepath string) string {
file, err := os.Open(filepath)
if err != nil {
return ""
}
defer file.Close()
// calculate the file size
info, _ := file.Stat()
filesize := info.Size()
blocks := uint64(math.Ceil(float64(filesize) / float64(filechunk)))
hash := md5.New()
for i := uint64(0); i < blocks; i++ {
blocksize := int(math.Min(filechunk, float64(filesize-int64(i*filechunk))))
buf := make([]byte, blocksize)
file.Read(buf)
io.WriteString(hash, string(buf))
}
return fmt.Sprintf("%x", hash.Sum(nil))
}