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  }