forked from Angey40/BaiduPCS-Go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.go
127 lines (109 loc) · 2.5 KB
/
util.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
package baidupcscmd
import (
"fmt"
"github.com/iikira/BaiduPCS-Go/config"
fpath "path"
"regexp"
"strings"
)
var (
patternRE = regexp.MustCompile(`[\[\]\*\?]`)
)
// getAbsPathNoMatch 获取绝对路径, 不检测通配符
func getAbsPathNoMatch(path string) string {
if !fpath.IsAbs(path) {
path = fpath.Dir(pcsconfig.ActiveBaiduUser.Workdir + "/" + path + "/")
}
return path
}
// getAllAbsPaths 获取所有绝对路径
func getAllAbsPaths(paths ...string) (_paths []string, err error) {
for k := range paths {
p, err := parsePath(paths[k])
if err != nil {
return nil, err
}
_paths = append(_paths, p...)
}
return
}
// getAbsPath 获取绝对路径, 获取错误将会返回 原路径 和 错误信息
func getAbsPath(path string) (string, error) {
p, err := parsePath(path)
if err != nil {
return path, err
}
if len(p) != 0 {
return p[0], nil
}
return "", fmt.Errorf("未找到路径")
}
// parsePath 递归解析通配符
func parsePath(path string) (paths []string, err error) {
path = getAbsPathNoMatch(path)
if patternRE.MatchString(path) {
paths = recurseParsePath(path)
if len(paths) == 0 {
return nil, fmt.Errorf("文件路径匹配失败, 请检查通配符")
}
return paths, nil
}
_, err = info.FilesDirectoriesMeta(path)
if err != nil {
return nil, err
}
paths = []string{path}
return
}
func recurseParsePath(path string) (paths []string) {
if !patternRE.MatchString(path) {
paths = []string{path}
return
}
if _, err := fpath.Match(path, ""); err != nil {
return nil
}
names := strings.Split(path, "/")
for k := range names {
if names[k] == "" || !patternRE.MatchString(names[k]) {
continue
}
pfiles, err := info.FileList(strings.Join(names[:k], "/"))
if err != nil {
fmt.Println(err)
return nil
}
for k2 := range pfiles {
ok, _ := fpath.Match(names[k], pfiles[k2].Filename)
if ok {
if k >= len(names)-1 {
paths = append(paths, strings.Join(names[:k], "/")+"/"+pfiles[k2].Filename)
} else if pfiles[k2].Isdir {
paths = append(paths, recurseParsePath(pfiles[k2].Path+"/"+strings.Join(names[k+1:], "/"))...)
}
}
}
break
}
return
}
func recurseFDCountTotalSize(path string) (fileN, directoryN, size int64) {
di, err := info.FileList(path)
if err != nil {
fmt.Println(err)
}
for k := range di {
if di[k].Isdir {
f, d, s := recurseFDCountTotalSize(di[k].Path)
fileN += f
directoryN += d
size += s
}
}
f, d := di.Count()
s := di.TotalSize()
fileN += f
directoryN += d
size += s
return
}