Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- ff "gochanneltest/utils"
- "os"
- "strings"
- "sync"
- "time"
- )
- var (
- wg sync.WaitGroup
- crGuard sync.RWMutex
- )
- func getInfo(folder string, c chan<- string) {
- defer wg.Done()
- // 遍历 test 文件夹中的内容
- f, err := os.ReadDir(folder)
- if err != nil {
- fmt.Println(err)
- }
- // 获取有效文件名,写入 c
- for _, filename := range f {
- if filename.IsDir() || strings.HasPrefix(filename.Name(), ".") {
- continue
- } else {
- c <- filename.Name()
- }
- }
- // 被 range 调用的 channel 要提前 close
- close(c)
- fmt.Println("Write filename done")
- }
- func MoveFile(oldfolder string, newfolder string, name string) error {
- // 一个丑陋的文件转移函数
- oldpath := oldfolder + "/" + name
- newpath := newfolder + "/" + name
- err := os.Rename(oldpath, newpath)
- return err
- }
- func dealInfo(target string, typeDict map[string]int, c <-chan string) {
- defer wg.Done()
- // 遍历 c 通道内的所有文件名
- for name := range c {
- sp := strings.Split(name, ".")
- suffix := sp[len(sp)-1]
- if _, ok := typeDict[suffix]; ok {
- // 如果文件夹已经存在,移动文件
- err := MoveFile(target, suffix, name)
- if err != nil {
- fmt.Println(err, "move file 1")
- }
- } else {
- // 如果文件夹不存在,创建文件夹,移动文件,打标记
- // crGuard.RLock()
- err := os.Mkdir(suffix, os.ModePerm)
- if err != nil {
- fmt.Println(err, "create folder")
- }
- // crGuard.RUnlock()
- err = MoveFile(target, suffix, name)
- if err != nil {
- fmt.Println(err, "move file 2")
- }
- typeDict[suffix] = 1
- }
- }
- }
- func main() {
- ff.GenFiles()
- c := make(chan string, 1000)
- typeDict := make(map[string]int)
- start := time.Now()
- wg.Add(1)
- go getInfo("./test", c)
- for i := 0; i < 16; i++ {
- wg.Add(1)
- go dealInfo("./test", typeDict, c)
- }
- wg.Wait()
- fmt.Println("time: ", time.Since(start))
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement