github.com/fzfile/BaiduPCS-Go@v0.0.0-20200606205115-4408961cf336/internal/pcscommand/cp_mv.go (about) 1 package pcscommand 2 3 import ( 4 "fmt" 5 "github.com/fzfile/BaiduPCS-Go/baidupcs" 6 "github.com/fzfile/BaiduPCS-Go/baidupcs/pcserror" 7 "path" 8 "strings" 9 ) 10 11 // RunCopy 执行 批量拷贝文件/目录 12 func RunCopy(paths ...string) { 13 runCpMvOp("copy", paths...) 14 } 15 16 // RunMove 执行 批量 重命名/移动 文件/目录 17 func RunMove(paths ...string) { 18 runCpMvOp("move", paths...) 19 } 20 21 func runCpMvOp(op string, paths ...string) { 22 err := cpmvPathValid(paths...) // 检查路径的有效性, 目前只是判断数量 23 if err != nil { 24 fmt.Printf("%s path error, %s\n", op, err) 25 return 26 } 27 28 froms, to := cpmvParsePath(paths...) // 分割 29 30 froms, err = matchPathByShellPattern(froms...) 31 if err != nil { 32 fmt.Println(err) 33 return 34 } 35 to = GetActiveUser().PathJoin(to) 36 37 // 尝试匹配 38 if strings.ContainsAny(to, baidupcs.ShellPatternCharacters) { 39 tos, _ := matchPathByShellPattern(to) 40 41 switch len(tos) { 42 case 0: 43 // do nothing 44 case 1: 45 to = tos[0] 46 default: 47 fmt.Printf("目标目录有 %d 条匹配结果, 请检查通配符\n", len(tos)) 48 return 49 } 50 } 51 52 pcs := GetBaiduPCS() 53 toInfo, pcsError := pcs.FilesDirectoriesMeta(to) 54 switch { 55 case toInfo != nil && toInfo.Path != to: 56 fallthrough 57 case pcsError != nil && pcsError.GetErrType() == pcserror.ErrTypeRemoteError: 58 // 判断路径是否存在 59 // 如果不存在, 则为重命名或同目录拷贝操作 60 61 // 如果 froms 数不是1, 则意义不明确. 62 if len(froms) != 1 { 63 fmt.Println(err) 64 return 65 } 66 67 if op == "copy" { // 拷贝 68 err = pcs.Copy(&baidupcs.CpMvJSON{ 69 From: froms[0], 70 To: to, 71 }) 72 if err != nil { 73 fmt.Println(err) 74 fmt.Println("文件/目录拷贝失败: ") 75 fmt.Printf("%s <-> %s\n", froms[0], to) 76 return 77 } 78 fmt.Println("文件/目录拷贝成功: ") 79 fmt.Printf("%s <-> %s\n", froms[0], to) 80 } else { // 重命名 81 err = pcs.Rename(froms[0], to) 82 if err != nil { 83 fmt.Println(err) 84 fmt.Println("重命名失败: ") 85 fmt.Printf("%s -> %s\n", froms[0], to) 86 return 87 } 88 fmt.Println("重命名成功: ") 89 fmt.Printf("%s -> %s\n", froms[0], to) 90 } 91 return 92 case pcsError != nil && pcsError.GetErrType() != pcserror.ErrTypeRemoteError: 93 fmt.Println(pcsError) 94 return 95 } 96 97 if !toInfo.Isdir { 98 fmt.Printf("目标 %s 不是一个目录, 操作失败\n", toInfo.Path) 99 return 100 } 101 102 cj := new(baidupcs.CpMvListJSON) 103 cj.List = make([]*baidupcs.CpMvJSON, len(froms)) 104 for k := range froms { 105 cj.List[k] = &baidupcs.CpMvJSON{ 106 From: froms[k], 107 To: path.Clean(to + baidupcs.PathSeparator + path.Base(froms[k])), 108 } 109 } 110 111 switch op { 112 case "copy": 113 err = pcs.Copy(cj.List...) 114 if err != nil { 115 fmt.Println(err) 116 fmt.Println("操作失败, 以下文件/目录拷贝失败: ") 117 fmt.Println(cj) 118 return 119 } 120 fmt.Println("操作成功, 以下文件/目录拷贝成功: ") 121 fmt.Println(cj) 122 case "move": 123 err = pcs.Move(cj.List...) 124 if err != nil { 125 fmt.Println(err) 126 fmt.Println("操作失败, 以下文件/目录移动失败: ") 127 fmt.Println(cj) 128 return 129 } 130 fmt.Println("操作成功, 以下文件/目录移动成功: ") 131 fmt.Println(cj) 132 default: 133 panic("Unknown operation:" + op) 134 } 135 return 136 } 137 138 // cpmvPathValid 检查路径的有效性 139 func cpmvPathValid(paths ...string) (err error) { 140 if len(paths) <= 1 { 141 return fmt.Errorf("参数不完整") 142 } 143 144 return nil 145 } 146 147 // cpmvParsePath 解析路径 148 func cpmvParsePath(paths ...string) (froms []string, to string) { 149 if len(paths) == 0 { 150 return nil, "" 151 } 152 froms = paths[:len(paths)-1] 153 to = paths[len(paths)-1] 154 return 155 }