文件同步
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

256 řádky
4.5 KiB

  1. package etcdclient
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "fts/config"
  7. shell "github.com/ipfs/go-ipfs-api"
  8. "go.etcd.io/etcd/clientv3"
  9. "log"
  10. "os"
  11. "path/filepath"
  12. "strings"
  13. "time"
  14. )
  15. func main() {
  16. //deleteAndAdd("C:\\Users\\yuan_rh\\easycloud\\330031270501289985\\2020双11")
  17. //getFileHash()
  18. err :=filepath.Walk("C:\\Users\\yuan_rh\\easycloud\\330031270501289985\\2020双11",walkfunc)
  19. if err!=nil{
  20. log.Println(err)
  21. return
  22. }
  23. err = BatchAdd(gobalFileMap)
  24. if err!=nil{
  25. log.Println(err)
  26. return
  27. }
  28. }
  29. func getFileHash() error{
  30. cli, err := clientv3.New(clientv3.Config{
  31. Endpoints: []string{config.EtcdUrl},
  32. DialTimeout: 5 * time.Second,
  33. })
  34. if err != nil {
  35. // handle error!
  36. log.Printf("connect to etcd failed, err:%v\n", err)
  37. return err
  38. }
  39. log.Println("connect to etcd success")
  40. defer cli.Close()
  41. ctx, cancel := context.WithTimeout(context.Background(), time.Second*60)
  42. resp, err := cli.Get(ctx, "key:330031270501289985:2020双11:file")
  43. cancel()
  44. if err != nil {
  45. fmt.Printf("get from etcd failed, err:%v\n", err)
  46. return err
  47. }
  48. for _, ev := range resp.Kvs {
  49. log.Print(string(ev.Value))
  50. }
  51. return nil
  52. }
  53. /**
  54. 获取客户端连接
  55. */
  56. func GetClient() (*clientv3.Client,error){
  57. cli, err := clientv3.New(clientv3.Config{
  58. Endpoints: []string{config.EtcdUrl},
  59. DialTimeout: 5 * time.Second,
  60. })
  61. if err != nil {
  62. // handle error!
  63. log.Printf("connect to etcd failed, err:%v\n", err)
  64. return nil,err
  65. }
  66. //log.Println("connect to etcd success")
  67. return cli,nil
  68. }
  69. /**
  70. 删除包含该前缀的所有Key
  71. */
  72. func DeleteWithPrefix(prefix string) error{
  73. if len(prefix)==0{
  74. return errors.New("参数prefix不能为空")
  75. }
  76. client,err := GetClient()
  77. if err!=nil{
  78. return err
  79. }
  80. defer client.Close()
  81. _, err = client.KV.Delete(context.Background(),prefix, clientv3.WithPrefix())
  82. if err!=nil{
  83. log.Println(err)
  84. return err
  85. }
  86. return err
  87. }
  88. /**
  89. 批量增加
  90. */
  91. func BatchAdd(dataMap map[string] string) error{
  92. if dataMap==nil || len(dataMap)==0{
  93. return errors.New("dataMap为空")
  94. }
  95. client,err := GetClient()
  96. if err!=nil{
  97. return err
  98. }
  99. defer client.Close()
  100. for k, v := range dataMap {
  101. _, err = client.KV.Put(context.Background(), k, v)
  102. if err!=nil{
  103. log.Println(err)
  104. return err
  105. }
  106. }
  107. return nil
  108. }
  109. /**
  110. 替换k,v
  111. */
  112. func ReplaceInto(k, v string) error{
  113. client,err := GetClient()
  114. if err!=nil{
  115. return err
  116. }
  117. defer client.Close()
  118. _,err =client.KV.Put(context.Background(), k, v)
  119. if err!=nil{
  120. log.Println(err)
  121. return err
  122. }
  123. return nil
  124. }
  125. /**
  126. 根据后缀查询
  127. */
  128. func QueryWithPrefix(prefix string) (map[string] string,error){
  129. client,err := GetClient()
  130. if err!=nil{
  131. log.Println(err)
  132. return nil,err
  133. }
  134. defer client.Close()
  135. resp,err :=client.KV.Get(context.Background(),prefix, clientv3.WithPrefix())
  136. if err!=nil{
  137. log.Println(err)
  138. return nil,err
  139. }
  140. var gobalFileMap = make(map[string] string)
  141. for _,v := range resp.Kvs{
  142. gobalFileMap[string(v.Key)]=string(v.Value)
  143. }
  144. return gobalFileMap,nil;
  145. }
  146. func deleteAndAdd(path string) error{
  147. cli, err := clientv3.New(clientv3.Config{
  148. Endpoints: []string{config.EtcdUrl},
  149. DialTimeout: 5 * time.Second,
  150. })
  151. if err != nil {
  152. // handle error!
  153. log.Printf("connect to etcd failed, err:%v\n", err)
  154. return err
  155. }
  156. log.Println("connect to etcd success")
  157. defer cli.Close()
  158. err =filepath.Walk(path,walkfunc)
  159. if err!=nil{
  160. log.Println(err)
  161. return err
  162. }
  163. //jsonByte,err :=json.Marshal(gobalFileMap)
  164. //jsonString :=string(jsonByte)
  165. //ctx, cancel := context.WithTimeout(context.Background(), time.Second*120)
  166. _,err =cli.Delete(context.Background(),"进入采购",clientv3.WithPrefix())
  167. log.Println(err)
  168. /*for k, v := range gobalFileMap {
  169. //log.Print(string(v))
  170. _, err = cli.Put(ctx, k, v)
  171. if err!=nil{
  172. log.Println(err)
  173. }
  174. }*/
  175. //_, err = cli.Put(ctx, "key:330031270501289985:2020双11:file", jsonString)
  176. //cancel()
  177. if err != nil {
  178. log.Printf("put to etcd failed, err:%v\n", err)
  179. return err
  180. }
  181. return nil
  182. }
  183. var gobalFileMap = make(map[string] string)
  184. var getLocalFileListDir string = "C:\\Users\\yuan_rh\\easycloud\\330031270501289985\\2020双11\\"
  185. func walkfunc(path string, info os.FileInfo, err error) error {
  186. if info.IsDir()==false{
  187. sh := shell.NewShell(config.GobalIpfsUrl)
  188. file,err :=os.Open(path)
  189. if err != nil{
  190. log.Println(err)
  191. return err
  192. }
  193. defer file.Close()
  194. hash,err :=sh.Add(file)
  195. if err != nil {
  196. log.Println(err)
  197. return err
  198. }
  199. dir :=strings.Replace(fmt.Sprint(path),fmt.Sprint(getLocalFileListDir),"",1)
  200. gobalFileMap[dir]=hash
  201. }
  202. return nil
  203. }