package etcdclient import ( "context" "errors" "fmt" "fts/config" shell "github.com/ipfs/go-ipfs-api" "go.etcd.io/etcd/clientv3" "log" "os" "path/filepath" "strings" "time" ) func main() { //deleteAndAdd("C:\\Users\\yuan_rh\\easycloud\\330031270501289985\\2020双11") //getFileHash() err :=filepath.Walk("C:\\Users\\yuan_rh\\easycloud\\330031270501289985\\2020双11",walkfunc) if err!=nil{ log.Println(err) return } err = BatchAdd(gobalFileMap) if err!=nil{ log.Println(err) return } } func getFileHash() error{ cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{config.EtcdUrl}, DialTimeout: 5 * time.Second, }) if err != nil { // handle error! log.Printf("connect to etcd failed, err:%v\n", err) return err } log.Println("connect to etcd success") defer cli.Close() ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) resp, err := cli.Get(ctx, "key:330031270501289985:2020双11:file") cancel() if err != nil { fmt.Printf("get from etcd failed, err:%v\n", err) return err } for _, ev := range resp.Kvs { log.Print(string(ev.Value)) } return nil } /** 获取客户端连接 */ func GetClient() (*clientv3.Client,error){ cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{config.EtcdUrl}, DialTimeout: 5 * time.Second, }) if err != nil { // handle error! log.Printf("connect to etcd failed, err:%v\n", err) return nil,err } log.Println("connect to etcd success") return cli,nil } /** 删除包含该前缀的所有Key */ func DeleteWithPrefix(prefix string) error{ if len(prefix)==0{ return errors.New("参数prefix不能为空") } client,err := GetClient() if err!=nil{ return err } defer client.Close() _, err = client.KV.Delete(context.Background(),prefix, clientv3.WithPrefix()) if err!=nil{ log.Println(err) return err } return err } /** 批量增加 */ func BatchAdd(dataMap map[string] string) error{ if dataMap==nil || len(dataMap)==0{ return errors.New("dataMap为空") } client,err := GetClient() if err!=nil{ return err } defer client.Close() for k, v := range dataMap { _, err = client.KV.Put(context.Background(), k, v) if err!=nil{ log.Println(err) return err } } return nil } /** 替换k,v */ func ReplaceInto(k, v string) error{ client,err := GetClient() if err!=nil{ return err } defer client.Close() _,err =client.KV.Put(context.Background(), k, v) if err!=nil{ log.Println(err) return err } return nil } /** 根据后缀查询 */ func QueryWithPrefix(prefix string) (map[string] string,error){ client,err := GetClient() if err!=nil{ log.Println(err) return nil,err } defer client.Close() resp,err :=client.KV.Get(context.Background(),prefix, clientv3.WithPrefix()) if err!=nil{ log.Println(err) return nil,err } var gobalFileMap = make(map[string] string) for _,v := range resp.Kvs{ gobalFileMap[string(v.Key)]=string(v.Value) } return gobalFileMap,nil; } func deleteAndAdd(path string) error{ cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{config.EtcdUrl}, DialTimeout: 5 * time.Second, }) if err != nil { // handle error! log.Printf("connect to etcd failed, err:%v\n", err) return err } log.Println("connect to etcd success") defer cli.Close() err =filepath.Walk(path,walkfunc) if err!=nil{ log.Println(err) return err } //jsonByte,err :=json.Marshal(gobalFileMap) //jsonString :=string(jsonByte) //ctx, cancel := context.WithTimeout(context.Background(), time.Second*120) _,err =cli.Delete(context.Background(),"进入采购",clientv3.WithPrefix()) log.Println(err) /*for k, v := range gobalFileMap { //log.Print(string(v)) _, err = cli.Put(ctx, k, v) if err!=nil{ log.Println(err) } }*/ //_, err = cli.Put(ctx, "key:330031270501289985:2020双11:file", jsonString) //cancel() if err != nil { log.Printf("put to etcd failed, err:%v\n", err) return err } return nil } var gobalFileMap = make(map[string] string) var getLocalFileListDir string = "C:\\Users\\yuan_rh\\easycloud\\330031270501289985\\2020双11\\" func walkfunc(path string, info os.FileInfo, err error) error { if info.IsDir()==false{ sh := shell.NewShell(config.GobalIpfsUrl) file,err :=os.Open(path) if err != nil{ log.Println(err) return err } defer file.Close() hash,err :=sh.Add(file) if err != nil { log.Println(err) return err } dir :=strings.Replace(fmt.Sprint(path),fmt.Sprint(getLocalFileListDir),"",1) gobalFileMap[dir]=hash } return nil }