Skip to content

Commit 4d641c1

Browse files
committed
seafile-cli增加cp命令的支持
1 parent 3b8d228 commit 4d641c1

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

seafile-cli/command_cp.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"os"
7+
"path/filepath"
8+
"strings"
9+
)
10+
11+
//cp命令的用法
12+
const CommandCpUsage = `
13+
cp 源文件 目标文件
14+
cp 源文件 目标文件夹/
15+
16+
eg:
17+
cp s3://资料库/文件路径 本地文件路径
18+
`
19+
20+
func init() {
21+
RegisterCommand("cp", CommandCpUsage, CommandCp)
22+
}
23+
24+
//cp命令
25+
func CommandCp(args ...string) {
26+
if len(args) != 2 {
27+
}
28+
29+
src := args[0]
30+
dst := args[1]
31+
32+
if strings.HasSuffix(dst, "/") {
33+
dst += filepath.Base(src)
34+
}
35+
36+
fmt.Printf("%s -> %s\n", src, dst)
37+
38+
fromSeafile := strings.HasPrefix(src, "sf://")
39+
toSeafile := strings.HasPrefix(dst, "sf://")
40+
41+
if fromSeafile {
42+
if toSeafile {
43+
transfer(src, dst)
44+
} else {
45+
download(src, dst)
46+
}
47+
} else {
48+
if toSeafile {
49+
upload(src, dst)
50+
} else {
51+
fmt.Println("不支持本地复制")
52+
}
53+
}
54+
}
55+
56+
//上传到Seafile资料库
57+
func upload(src, dst string) {
58+
libName, dst := parseDirectory(strings.TrimPrefix(dst, "sf://"))
59+
library, err := sf.GetLibrary(libName)
60+
if err != nil {
61+
fmt.Println("获取资料库失败: %s", err)
62+
return
63+
}
64+
65+
b, err := ioutil.ReadFile(src)
66+
if err != nil {
67+
fmt.Println("无法读取源文件: %s", err)
68+
return
69+
}
70+
71+
dir := filepath.Dir(dst) + "/"
72+
fname := filepath.Base(dst)
73+
contents := map[string][]byte{fname: b}
74+
err = library.UploadFileContent(dir, contents)
75+
if err != nil {
76+
fmt.Println("上传失败: %s", err)
77+
}
78+
}
79+
80+
//从Seafile资料库下载文件
81+
func download(src, dst string) {
82+
libName, src := parseDirectory(strings.TrimPrefix(src, "sf://"))
83+
library, err := sf.GetLibrary(libName)
84+
if err != nil {
85+
fmt.Println("获取资料库失败: %s", err)
86+
return
87+
}
88+
89+
b, err := library.FetchFileContent(src)
90+
if err != nil {
91+
fmt.Println("下载失败: %s", err)
92+
return
93+
}
94+
95+
file, err := os.Create(dst)
96+
if err != nil {
97+
fmt.Println("打开文件失败: %s", err)
98+
return
99+
}
100+
defer file.Close()
101+
102+
_, err = file.Write(b)
103+
if err != nil {
104+
fmt.Println("写入文件失败: %s", err)
105+
return
106+
}
107+
}
108+
109+
//Seafile资料库之间复制文件
110+
func transfer(src, dst string) {
111+
srcLibName, src := parseDirectory(strings.TrimPrefix(src, "sf://"))
112+
srcLibrary, err := sf.GetLibrary(srcLibName)
113+
if err != nil {
114+
fmt.Println("获取源资料库失败: %s", err)
115+
return
116+
}
117+
118+
fmt.Println(srcLibrary)
119+
120+
dstLibName, dst := parseDirectory(strings.TrimPrefix(dst, "sf://"))
121+
dstLibrary, err := sf.GetLibrary(dstLibName)
122+
if err != nil {
123+
fmt.Println("获取目标资料库失败: %s", err)
124+
return
125+
}
126+
127+
fmt.Println(dstLibrary)
128+
129+
err = srcLibrary.CopyFileToLibrary(src, dstLibrary.Id, filepath.Dir(dst))
130+
if err != nil {
131+
fmt.Println("复制文件失败: %s", err)
132+
return
133+
}
134+
}

0 commit comments

Comments
 (0)