《The Go ProgrAMMing Language》笔记
import ( "flag" "fmt" "io/IoUtil" "os" "path/filepath" "sync" "time" ) //获取目录dir下的文件大小 func walkDir(dir ,wg *sync.WaitGroup,fileSizes chan<- int64) { defer wg.Done() for _,entry := range dirents(dir) { if entry.IsDir() {//目录 wg.Add(1) subDir := filepath.Join(dir,entry.Name()) go walkDir(subDir,wg,fileSizes) } else { fileSizes <- entry.Size() } } } //sema is a counTing semaphore for limiTing concurrency in dirents var sema = @H_263_50@make(chan struct{}, 20) //读取目录dir下的文件信息 func dirents(dir ) []os.FileInfo { sema <- struct{}{} defer func() { <-sema }() entries,err := IoUtil.ReadDir(dir) if err != nil { fmt.Fprintf(os.Stderr,"du: %v\n",err) return nil } return entries } //输出文件数量的大小 func printDiskUsage(nfiles,nbytes int64) { fmt.Printf("%d files %.1f GB\n",nfiles,float64(nbytes)/1e9) } //提供-v 参数会显示程序进度信息 var verbose = flag.bool("v",,"show verbose progress messages") func Start() { flag.Parse() roots := flag.Args()//需要统计的目录 if len(roots) == 0 { roots = []{"."} } fileSizes := @H_263_50@make(chan int64) var wg sync.WaitGroup for _,root := range roots { wg.Add(1) go walkDir(root,&wg,fileSizes) } go func() { wg.Wait() //等待goroutIne结束 close(fileSizes) }() var tick <-chan time.Time if *verbose { tick = time.Tick(100 * time.Millisecond) //输出时间间隔 } var nfiles,nbytes int64 loop: for { { case size,ok := <-fileSizes: if !ok { break loop } nfiles++ nbytes += size case <-tick: printDiskUsage(nfiles,nbytes) } } printDiskUsage(nfiles,nbytes) }@H_675_169@
大佬总结
以上是大佬教程为你收集整理的Golang 目录文件数量和大小统计全部内容,希望文章能够帮你解决Golang 目录文件数量和大小统计所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。