package main
import (
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sync"
"time"
)
var (
dir *string = flag.String("p", "/Users/xiaoshan02/gopath", "input directory")
routineCount *int = flag.Int("c", 10, "concurrency of program")
verbose *bool = flag.Bool("v", false, "print verbose progress")
)
func walkDir(dir string, fileSizes chan int64, concurrency chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
for _, entry := range dirEntries(dir, concurrency) {
if entry.IsDir() {
wg.Add(1)
subdir := filepath.Join(dir, entry.Name())
go walkDir(subdir, fileSizes, concurrency, wg)
} else {
fileSizes <- entry.Size()
}
}
}
func dirEntries(dir string, concurrency chan struct{}) []os.FileInfo {
concurrency <- struct{}{}
defer func() {
<-concurrency
}()
entries, err := ioutil.ReadDir(dir)
if err !&#
Golang中利用channel和select实现计算目录大小
最新推荐文章于 2023-05-18 14:27:48 发布