diff --git a/handle/handle.go b/handle/handle.go index cbab30d..dffba1c 100644 --- a/handle/handle.go +++ b/handle/handle.go @@ -27,7 +27,10 @@ var gobalFileUpdateTimeMap = make(map[string] string) var getLocalFileListDir string var gobalSubscriptionFileChangeSwitch int =0 //订阅文件变更开关 -var ipfsPath=os.Getenv("IPFS-PATH")+"ipfs.exe" + + +var ipfsPath=os.Getenv("IPFS-PATH") + /** 文件上传下载进度 */ @@ -40,6 +43,8 @@ type processStruct struct { } func main() { + + //config.InitConfig() //InitLocalWorkSpace("320872793405132801","test1") // @@ -59,6 +64,9 @@ func main() { */ func InitLocalWorkSpace(conn *websocket.Conn,userId,projectName string) (error){ + //空格路径处理 + ipfsPath=strings.Replace(os.Getenv("IPFS-PATH"),"\"","",1)+"\\ipfs.exe" + //初始化当前登陆用户 gobalLoginUserId = userId @@ -105,6 +113,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) } } + var downloading bool = false cmd := exec.Command(ipfsPath,"get", hash,"-o",fmt.Sprint(absoluteDir+"\\"+fileName)) progress := make(chan string,10000) @@ -121,10 +130,10 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) }() go func(){ - seconds := time.Now().Unix() + millSeconds := time.Now().UnixNano() / 1e6 for content := range progress { // 通道关闭后会退出for range循环 - current :=time.Now().Unix() - if current-seconds>1{ + current :=time.Now().UnixNano() / 1e6 + if current-millSeconds>500{ projson,err := contentToJSONByte(content) if projson==nil && err==nil{ continue @@ -133,11 +142,12 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) if err != nil { log.Printf("json.Marshal error %s\n", err) } + downloading = true if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { log.Println(err) break } - seconds = current + millSeconds = current } if strings.Index(content,"100.00%")!=-1{ @@ -149,6 +159,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) if err != nil { log.Printf("json.Marshal error %s\n", err) } + downloading = true if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { panic(err) } @@ -163,18 +174,17 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) go func() { index :=0 for true{ - if cmd.ProcessState==nil{ - index++ - time.Sleep(time.Duration(1)*time.Second) - if index==30{ - err = cmd.Process.Kill() - log.Println("进程连接超时30s已被Kill") - if err := conn.WriteMessage(websocket.TextMessage, []byte("-1")); err != nil { - return - } + index++ + if downloading==true{ + return + } + time.Sleep(time.Duration(1)*time.Second) + if downloading==false && index==30{ + err = cmd.Process.Kill() + log.Println("进程连接超时30s已被Kill") + if err := conn.WriteMessage(websocket.TextMessage, []byte("-1")); err != nil { return } - }else { return } } @@ -182,7 +192,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) err = cmd.Wait() if err != nil { - log.Panicf("cmd.Run() failed with %s\n", err) + log.Printf("cmd.Run() failed with %s\n", err) } if errStdout != nil || errStderr != nil { log.Printf("failed to capture stdout or stderr\n") @@ -239,22 +249,6 @@ func contentToJSONByte(content string) ([]byte,error){ @param dir 云文件目录 */ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir string) error{ - //拷贝文件 - - //上传文件 - - // - //file,err :=os.Open(absolutePath) - //if err != nil{ - // return "",err - //} - // - //defer file.Close() - // - //hash,err :=sh.Add(file) - //if err != nil { - // return "",err - //} //本地拷贝文件 absoluteDir := config.LocalWorkSpaceDir+"\\"+gobalLoginUserId+"\\"+projectName+"\\"+dir @@ -268,6 +262,18 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st } } + //检测文件打开状态 + _,err = os.OpenFile(absolutePath,os.O_RDWR,1) + if err != nil { + log.Println("文件被占用,请关闭打开的软件") + if err := conn.WriteMessage(websocket.TextMessage, []byte("-2")); err != nil { + return err + } + return err + } + + var uploading bool=false + cmd := exec.Command(ipfsPath, "add",absolutePath) uploadProgress := make(chan string,10000) var stdout, stderr []byte @@ -283,22 +289,23 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st }() go func(){ - seconds := time.Now().Unix() + millSeconds := time.Now().UnixNano() / 1e6 for content := range uploadProgress { // 通道关闭后会退出for range循环 - current :=time.Now().Unix() - if current-seconds>1{ + current :=time.Now().UnixNano() / 1e6 + if current-millSeconds>500{ projson,err := contentToJSONByte(content) if projson==nil && err==nil{ continue } if err != nil { - log.Fatalf("json.Marshal error %s\n", err) + log.Println("json.Marshal error %s\n", err) } + uploading=true if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { break } - seconds = current + millSeconds = current } if strings.Index(content,"100.00%")!=-1{ @@ -309,8 +316,9 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st if err != nil { - log.Fatalf("json.Marshal error %s\n", err) + log.Println("json.Marshal error %s\n", err) } + uploading=true if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { panic(err) } @@ -319,13 +327,35 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st } }() + log.Println("文件上传中...") + + //设置30秒连接超时 + go func() { + index :=0 + for true{ + index++ + if uploading==true{ + return + } + time.Sleep(time.Duration(1)*time.Second) + if uploading==false && index==30{ + err = cmd.Process.Kill() + log.Println("进程连接超时30s已被Kill") + if err := conn.WriteMessage(websocket.TextMessage, []byte("-1")); err != nil { + return + } + return + } + } + }() + err = cmd.Wait() if err != nil { - log.Fatalf("cmd.Run() failed with %s\n", err) + log.Println("cmd.Run() failed with %s\n", err) } if errStdout != nil || errStderr != nil { - log.Fatalf("failed to capture stdout or stderr\n") + log.Println("failed to capture stdout or stderr\n") } outStr, errStr := string(stdout), string(stderr) log.Printf("out:%s,err:%s", outStr, errStr) @@ -432,6 +462,7 @@ func SubscriptionFileChange(conn *websocket.Conn, projectName string) error{ if err := conn.WriteMessage(websocket.TextMessage, mapByte); err != nil { log.Println(err) + return err } log.Println("检查本地目录文件变更状态,执行睡眠时间1分钟") @@ -451,6 +482,7 @@ func walkfunc(path string, info os.FileInfo, err error) error { sh := shell.NewShell(config.GobalIpfsUrl) file,err :=os.Open(path) + if err != nil{ log.Println(err) return err diff --git a/websocket/websocket.go b/websocket/websocket.go index 343fcf1..66eda1b 100644 --- a/websocket/websocket.go +++ b/websocket/websocket.go @@ -1,7 +1,6 @@ package websocket import ( - "fmt" "fts/handle" "github.com/gorilla/websocket" "log" @@ -46,7 +45,7 @@ func UploadHandler(w http.ResponseWriter, r *http.Request) { params :=strings.Split(string(data),"|") err := handle.UploadCommand(conn,params[0],params[1],params[2],params[3]) if err!=nil{ - fmt.Println(err) + log.Println(err) goto ERR } goto ERR @@ -84,7 +83,7 @@ func DownloadHandler(w http.ResponseWriter, r *http.Request) { params :=strings.Split(string(data),"|") err := handle.DownCommand(conn,params[0],params[1],params[2],params[3]) if err!=nil{ - fmt.Println(err) + log.Println(err) goto ERR } @@ -123,7 +122,7 @@ func InitLocalWorkSpaceHandler(w http.ResponseWriter, r *http.Request) { params :=strings.Split(string(data),"|") err := handle.InitLocalWorkSpace(conn,params[0],params[1]) if err!=nil{ - fmt.Println(err) + log.Println(err) goto ERR } @@ -162,7 +161,7 @@ func SubscriptionFileChangeHandler(w http.ResponseWriter, r *http.Request){ if err != nil { //报错了 - fmt.Println(err) + log.Println(err) goto ERR }