Advertisement
Guest User

go_channel_test

a guest
Nov 7th, 2022
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.95 KB | Source Code | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     ff "gochanneltest/utils"
  6.     "os"
  7.     "strings"
  8.     "sync"
  9.     "time"
  10. )
  11.  
  12. var (
  13.     wg      sync.WaitGroup
  14.     crGuard sync.RWMutex
  15. )
  16.  
  17. func getInfo(folder string, c chan<- string) {
  18.     defer wg.Done()
  19.     // 遍历 test 文件夹中的内容
  20.     f, err := os.ReadDir(folder)
  21.     if err != nil {
  22.         fmt.Println(err)
  23.     }
  24.  
  25.     // 获取有效文件名,写入 c
  26.     for _, filename := range f {
  27.         if filename.IsDir() || strings.HasPrefix(filename.Name(), ".") {
  28.             continue
  29.         } else {
  30.             c <- filename.Name()
  31.         }
  32.     }
  33.     // 被 range 调用的 channel 要提前 close
  34.     close(c)
  35.     fmt.Println("Write filename done")
  36. }
  37.  
  38. func MoveFile(oldfolder string, newfolder string, name string) error {
  39.     // 一个丑陋的文件转移函数
  40.     oldpath := oldfolder + "/" + name
  41.     newpath := newfolder + "/" + name
  42.  
  43.     err := os.Rename(oldpath, newpath)
  44.     return err
  45. }
  46.  
  47. func dealInfo(target string, typeDict map[string]int, c <-chan string) {
  48.     defer wg.Done()
  49.  
  50.     // 遍历 c 通道内的所有文件名
  51.     for name := range c {
  52.         sp := strings.Split(name, ".")
  53.         suffix := sp[len(sp)-1]
  54.  
  55.         if _, ok := typeDict[suffix]; ok {
  56.             // 如果文件夹已经存在,移动文件
  57.             err := MoveFile(target, suffix, name)
  58.             if err != nil {
  59.                 fmt.Println(err, "move file 1")
  60.             }
  61.         } else {
  62.             // 如果文件夹不存在,创建文件夹,移动文件,打标记
  63.             // crGuard.RLock()
  64.             err := os.Mkdir(suffix, os.ModePerm)
  65.             if err != nil {
  66.                 fmt.Println(err, "create folder")
  67.             }
  68.             // crGuard.RUnlock()
  69.  
  70.             err = MoveFile(target, suffix, name)
  71.             if err != nil {
  72.                 fmt.Println(err, "move file 2")
  73.             }
  74.             typeDict[suffix] = 1
  75.         }
  76.     }
  77. }
  78.  
  79. func main() {
  80.     ff.GenFiles()
  81.  
  82.     c := make(chan string, 1000)
  83.     typeDict := make(map[string]int)
  84.     start := time.Now()
  85.  
  86.     wg.Add(1)
  87.     go getInfo("./test", c)
  88.  
  89.     for i := 0; i < 16; i++ {
  90.         wg.Add(1)
  91.         go dealInfo("./test", typeDict, c)
  92.     }
  93.  
  94.     wg.Wait()
  95.  
  96.     fmt.Println("time: ", time.Since(start))
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement