-
Notifications
You must be signed in to change notification settings - Fork 0
/
cp_mv.go
157 lines (139 loc) · 3.52 KB
/
cp_mv.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
package pcscommand
import (
"fmt"
"github.com/iikira/BaiduPCS-Go/baidupcs"
"github.com/iikira/BaiduPCS-Go/baidupcs/pcserror"
"github.com/iikira/BaiduPCS-Go/pcspath"
"path"
)
// RunCopy 执行 批量拷贝文件/目录
func RunCopy(paths ...string) {
runCpMvOp("copy", paths...)
}
// RunMove 执行 批量 重命名/移动 文件/目录
func RunMove(paths ...string) {
runCpMvOp("move", paths...)
}
func runCpMvOp(op string, paths ...string) {
err := cpmvPathValid(paths...) // 检查路径的有效性, 目前只是判断数量
if err != nil {
fmt.Printf("%s path error, %s\n", op, err)
return
}
froms, to := cpmvParsePath(paths...) // 分割
froms, err = getAllAbsPaths(froms...)
if err != nil {
fmt.Printf("解析路径出错, %s\n", err)
return
}
pcsPath := pcspath.NewPCSPath(&GetActiveUser().Workdir, to)
to = pcsPath.AbsPathNoMatch()
// 尝试匹配
if patternRE.MatchString(to) {
tos, _ := getAllAbsPaths(to)
switch len(tos) {
case 0:
// do nothing
case 1:
to = tos[0]
default:
fmt.Printf("目标目录有 %d 条匹配结果, 请检查通配符", len(tos))
return
}
}
pcs := GetBaiduPCS()
toInfo, pcsError := pcs.FilesDirectoriesMeta(to)
switch {
case toInfo != nil && toInfo.Path != to:
fallthrough
case pcsError != nil && pcsError.GetErrType() == pcserror.ErrTypeRemoteError:
// 判断路径是否存在
// 如果不存在, 则为重命名或同目录拷贝操作
// 如果 froms 数不是1, 则意义不明确.
if len(froms) != 1 {
fmt.Println(err)
return
}
if op == "copy" { // 拷贝
err = pcs.Copy(&baidupcs.CpMvJSON{
From: froms[0],
To: to,
})
if err != nil {
fmt.Println(err)
fmt.Println("文件/目录拷贝失败: ")
fmt.Printf("%s <-> %s\n", froms[0], to)
return
}
fmt.Println("文件/目录拷贝成功: ")
fmt.Printf("%s <-> %s\n", froms[0], to)
} else { // 重命名
err = pcs.Rename(froms[0], to)
if err != nil {
fmt.Println(err)
fmt.Println("重命名失败: ")
fmt.Printf("%s -> %s\n", froms[0], to)
return
}
fmt.Println("重命名成功: ")
fmt.Printf("%s -> %s\n", froms[0], to)
}
return
case pcsError != nil && pcsError.GetErrType() != pcserror.ErrTypeRemoteError:
fmt.Println(pcsError)
return
}
if !toInfo.Isdir {
fmt.Printf("目标 %s 不是一个目录, 操作失败\n", toInfo.Path)
return
}
cj := new(baidupcs.CpMvListJSON)
cj.List = make([]*baidupcs.CpMvJSON, len(froms))
for k := range froms {
cj.List[k] = &baidupcs.CpMvJSON{
From: froms[k],
To: path.Clean(to + "/" + path.Base(froms[k])),
}
}
switch op {
case "copy":
err = pcs.Copy(cj.List...)
if err != nil {
fmt.Println(err)
fmt.Println("操作失败, 以下文件/目录拷贝失败: ")
fmt.Println(cj)
return
}
fmt.Println("操作成功, 以下文件/目录拷贝成功: ")
fmt.Println(cj)
case "move":
err = pcs.Move(cj.List...)
if err != nil {
fmt.Println(err)
fmt.Println("操作失败, 以下文件/目录移动失败: ")
fmt.Println(cj)
return
}
fmt.Println("操作成功, 以下文件/目录移动成功: ")
fmt.Println(cj)
default:
panic("Unknown operation:" + op)
}
return
}
// cpmvPathValid 检查路径的有效性
func cpmvPathValid(paths ...string) (err error) {
if len(paths) <= 1 {
return fmt.Errorf("参数不完整")
}
return nil
}
// cpmvParsePath 解析路径
func cpmvParsePath(paths ...string) (froms []string, to string) {
if len(paths) == 0 {
return nil, ""
}
froms = paths[:len(paths)-1]
to = paths[len(paths)-1]
return
}