文件同步
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

main.go 3.7 KiB

4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
4 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package main
  2. import (
  3. "fmt"
  4. _ "fmt"
  5. "fts/config"
  6. "fts/websocket"
  7. "github.com/fsnotify/fsnotify"
  8. _ "github.com/ipfs/go-ipfs-api"
  9. "io"
  10. "log"
  11. "net/http"
  12. "os"
  13. _ "os"
  14. "path/filepath"
  15. _ "strings"
  16. )
  17. func main() {
  18. config.InitConfig()
  19. //日志设置
  20. _,err := os.Stat(config.LocalWorkSpaceDir)
  21. if err != nil {
  22. //创建文件目录
  23. os.MkdirAll(config.LocalWorkSpaceDir, os.ModePerm)
  24. }
  25. logpath :=config.LocalWorkSpaceDir+"\\"+"fts.log"
  26. logFile, err := os.OpenFile(logpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
  27. if err != nil {
  28. log.Printf("open log file failed, err:", err)
  29. return
  30. }
  31. multiWriter := io.MultiWriter(os.Stdout,logFile)
  32. log.SetOutput(multiWriter)
  33. log.SetPrefix("[fts] ")
  34. log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
  35. //handle.InitLocalWorkSpace(nil,"324523676458291200","11.4")
  36. //http://localhost:7777/ws
  37. http.HandleFunc("/upload", websocket.UploadHandler)
  38. http.HandleFunc("/subscriptionFileChange", websocket.SubscriptionFileChangeHandler)
  39. http.HandleFunc("/download", websocket.DownloadHandler)
  40. http.HandleFunc("/init", websocket.InitLocalWorkSpaceHandler)
  41. http.HandleFunc("/getFolderFileInfo", websocket.GetFolderFileInfoHandler)
  42. http.HandleFunc("/openFileWith", websocket.OpenFileWithHandler)
  43. http.HandleFunc("/checkForUpdates", websocket.CheckForUpdatesHandler)
  44. http.HandleFunc("/initClientConfig", websocket.InitClientConfigHandler)
  45. //服务端启动
  46. log.Println("服务启动成功,监听端口7777,等待连接。")
  47. http.ListenAndServe("0.0.0.0:7777", nil)
  48. }
  49. //func main() {
  50. // watch, _ := fsnotify.NewWatcher()
  51. // w := Watch{
  52. // watch: watch,
  53. // }
  54. // w.watchDir("C:\\Users\\yuan_rh\\easycloud\\324523676458291200");
  55. // select {};
  56. //}
  57. type Watch struct {
  58. watch *fsnotify.Watcher;
  59. }
  60. //监控目录
  61. func (w *Watch) watchDir(dir string) {
  62. //通过Walk来遍历目录下的所有子目录
  63. filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  64. //这里判断是否为目录,只需监控目录即可
  65. //目录下的文件也在监控范围内,不需要我们一个一个加
  66. if info.IsDir() {
  67. path, err := filepath.Abs(path);
  68. if err != nil {
  69. return err;
  70. }
  71. err = w.watch.Add(path);
  72. if err != nil {
  73. return err;
  74. }
  75. fmt.Println("监控 : ", path);
  76. }
  77. return nil;
  78. });
  79. go func() {
  80. for {
  81. select {
  82. case ev := <-w.watch.Events:
  83. {
  84. if ev.Op&fsnotify.Create == fsnotify.Create {
  85. fmt.Println("创建文件 : ", ev.Name);
  86. //这里获取新创建文件的信息,如果是目录,则加入监控中
  87. fi, err := os.Stat(ev.Name);
  88. if err == nil && fi.IsDir() {
  89. w.watch.Add(ev.Name);
  90. fmt.Println("添加监控 : ", ev.Name);
  91. }
  92. }
  93. if ev.Op&fsnotify.Write == fsnotify.Write {
  94. fmt.Println("写入文件 : ", ev.Name);
  95. }
  96. if ev.Op&fsnotify.Remove == fsnotify.Remove {
  97. fmt.Println("删除文件 : ", ev.Name);
  98. //如果删除文件是目录,则移除监控
  99. fi, err := os.Stat(ev.Name);
  100. if err == nil && fi.IsDir() {
  101. w.watch.Remove(ev.Name);
  102. fmt.Println("删除监控 : ", ev.Name);
  103. }
  104. }
  105. if ev.Op&fsnotify.Rename == fsnotify.Rename {
  106. fmt.Println("重命名文件 : ", ev.Name);
  107. //如果重命名文件是目录,则移除监控
  108. //注意这里无法使用os.Stat来判断是否是目录了
  109. //因为重命名后,go已经无法找到原文件来获取信息了
  110. //所以这里就简单粗爆的直接remove好了
  111. w.watch.Remove(ev.Name);
  112. }
  113. if ev.Op&fsnotify.Chmod == fsnotify.Chmod {
  114. fmt.Println("修改权限 : ", ev.Name);
  115. }
  116. }
  117. case err := <-w.watch.Errors:
  118. {
  119. fmt.Println("error : ", err);
  120. return;
  121. }
  122. }
  123. }
  124. }();
  125. }