|
@@ -27,7 +27,10 @@ var gobalFileUpdateTimeMap = make(map[string] string) |
|
|
var getLocalFileListDir string |
|
|
var getLocalFileListDir string |
|
|
var gobalSubscriptionFileChangeSwitch int =0 //订阅文件变更开关 |
|
|
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() { |
|
|
func main() { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//config.InitConfig() |
|
|
//config.InitConfig() |
|
|
//InitLocalWorkSpace("320872793405132801","test1") |
|
|
//InitLocalWorkSpace("320872793405132801","test1") |
|
|
// |
|
|
// |
|
@@ -59,6 +64,9 @@ func main() { |
|
|
*/ |
|
|
*/ |
|
|
func InitLocalWorkSpace(conn *websocket.Conn,userId,projectName string) (error){ |
|
|
func InitLocalWorkSpace(conn *websocket.Conn,userId,projectName string) (error){ |
|
|
|
|
|
|
|
|
|
|
|
//空格路径处理 |
|
|
|
|
|
ipfsPath=strings.Replace(os.Getenv("IPFS-PATH"),"\"","",1)+"\\ipfs.exe" |
|
|
|
|
|
|
|
|
//初始化当前登陆用户 |
|
|
//初始化当前登陆用户 |
|
|
gobalLoginUserId = userId |
|
|
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)) |
|
|
cmd := exec.Command(ipfsPath,"get", hash,"-o",fmt.Sprint(absoluteDir+"\\"+fileName)) |
|
|
progress := make(chan string,10000) |
|
|
progress := make(chan string,10000) |
|
@@ -121,10 +130,10 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) |
|
|
}() |
|
|
}() |
|
|
|
|
|
|
|
|
go func(){ |
|
|
go func(){ |
|
|
seconds := time.Now().Unix() |
|
|
|
|
|
|
|
|
millSeconds := time.Now().UnixNano() / 1e6 |
|
|
for content := range progress { // 通道关闭后会退出for range循环 |
|
|
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) |
|
|
projson,err := contentToJSONByte(content) |
|
|
if projson==nil && err==nil{ |
|
|
if projson==nil && err==nil{ |
|
|
continue |
|
|
continue |
|
@@ -133,11 +142,12 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
log.Printf("json.Marshal error %s\n", err) |
|
|
log.Printf("json.Marshal error %s\n", err) |
|
|
} |
|
|
} |
|
|
|
|
|
downloading = true |
|
|
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { |
|
|
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { |
|
|
log.Println(err) |
|
|
log.Println(err) |
|
|
break |
|
|
break |
|
|
} |
|
|
} |
|
|
seconds = current |
|
|
|
|
|
|
|
|
millSeconds = current |
|
|
} |
|
|
} |
|
|
if strings.Index(content,"100.00%")!=-1{ |
|
|
if strings.Index(content,"100.00%")!=-1{ |
|
|
|
|
|
|
|
@@ -149,6 +159,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
log.Printf("json.Marshal error %s\n", err) |
|
|
log.Printf("json.Marshal error %s\n", err) |
|
|
} |
|
|
} |
|
|
|
|
|
downloading = true |
|
|
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { |
|
|
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { |
|
|
panic(err) |
|
|
panic(err) |
|
|
} |
|
|
} |
|
@@ -163,18 +174,17 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) |
|
|
go func() { |
|
|
go func() { |
|
|
index :=0 |
|
|
index :=0 |
|
|
for true{ |
|
|
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 |
|
|
return |
|
|
} |
|
|
} |
|
|
}else { |
|
|
|
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@@ -182,7 +192,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string) |
|
|
|
|
|
|
|
|
err = cmd.Wait() |
|
|
err = cmd.Wait() |
|
|
if err != nil { |
|
|
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 { |
|
|
if errStdout != nil || errStderr != nil { |
|
|
log.Printf("failed to capture stdout or stderr\n") |
|
|
log.Printf("failed to capture stdout or stderr\n") |
|
@@ -239,22 +249,6 @@ func contentToJSONByte(content string) ([]byte,error){ |
|
|
@param dir 云文件目录 |
|
|
@param dir 云文件目录 |
|
|
*/ |
|
|
*/ |
|
|
func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir string) error{ |
|
|
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 |
|
|
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) |
|
|
cmd := exec.Command(ipfsPath, "add",absolutePath) |
|
|
uploadProgress := make(chan string,10000) |
|
|
uploadProgress := make(chan string,10000) |
|
|
var stdout, stderr []byte |
|
|
var stdout, stderr []byte |
|
@@ -283,22 +289,23 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st |
|
|
}() |
|
|
}() |
|
|
|
|
|
|
|
|
go func(){ |
|
|
go func(){ |
|
|
seconds := time.Now().Unix() |
|
|
|
|
|
|
|
|
millSeconds := time.Now().UnixNano() / 1e6 |
|
|
for content := range uploadProgress { // 通道关闭后会退出for range循环 |
|
|
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) |
|
|
projson,err := contentToJSONByte(content) |
|
|
if projson==nil && err==nil{ |
|
|
if projson==nil && err==nil{ |
|
|
continue |
|
|
continue |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if err != nil { |
|
|
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 { |
|
|
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { |
|
|
break |
|
|
break |
|
|
} |
|
|
} |
|
|
seconds = current |
|
|
|
|
|
|
|
|
millSeconds = current |
|
|
} |
|
|
} |
|
|
if strings.Index(content,"100.00%")!=-1{ |
|
|
if strings.Index(content,"100.00%")!=-1{ |
|
|
|
|
|
|
|
@@ -309,8 +316,9 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
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 { |
|
|
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { |
|
|
panic(err) |
|
|
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() |
|
|
err = cmd.Wait() |
|
|
|
|
|
|
|
|
if err != nil { |
|
|
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 { |
|
|
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) |
|
|
outStr, errStr := string(stdout), string(stderr) |
|
|
log.Printf("out:%s,err:%s", outStr, errStr) |
|
|
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 { |
|
|
if err := conn.WriteMessage(websocket.TextMessage, mapByte); err != nil { |
|
|
log.Println(err) |
|
|
log.Println(err) |
|
|
|
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
log.Println("检查本地目录文件变更状态,执行睡眠时间1分钟") |
|
|
log.Println("检查本地目录文件变更状态,执行睡眠时间1分钟") |
|
@@ -451,6 +482,7 @@ func walkfunc(path string, info os.FileInfo, err error) error { |
|
|
|
|
|
|
|
|
sh := shell.NewShell(config.GobalIpfsUrl) |
|
|
sh := shell.NewShell(config.GobalIpfsUrl) |
|
|
file,err :=os.Open(path) |
|
|
file,err :=os.Open(path) |
|
|
|
|
|
|
|
|
if err != nil{ |
|
|
if err != nil{ |
|
|
log.Println(err) |
|
|
log.Println(err) |
|
|
return err |
|
|
return err |
|
|