golang练手小项目系列(3)-并发读取文件夹信息

栏目: Go · 发布时间: 5年前

问题描述:

实现一个程序计算并打印输入的目录下所有文件的总数和总大小(以GB计算)。完成之后你将熟悉select、WaitGroup、ioutil的用法。

要点:

并发读取文件(夹)信息。

限制开启的goroutines的最大数量。

运行时每隔500ms打印当前已经统计的文件数和总大小(使用命令行参数指定此功能是否启用)。

拓展:

在执行中在有外部输入时退出程序。

实现:

import (

"flag"

"fmt"

"io/ioutil"

"os"

"path/filepath"

"sync"

"time"

)

var verbose = flag.Bool("v", false, "show verbose progress messages")

var sema = make(chan struct{}, 50)

var done = make(chan struct{})

func dirents(dir string) []os.FileInfo{

select {

case sema <- struct{}{}: //

case <- done:

return nil

}

defer func() {<- sema}()

entries, err := ioutil.ReadDir(dir)

if err != nil{

fmt.Fprintf(os.Stderr, "du1: %v\n", err)

return nil

}

return entries

}

func walkDir(dir string, n *sync.WaitGroup, fileSizes chan<- int64){

defer n.Done()

if cancelled(){

return

}

for _, entry := range dirents(dir){

if entry.IsDir(){

n.Add(1)

subdir := filepath.Join(dir, entry.Name())

go walkDir(subdir, n, fileSizes)

} else {

fileSizes <- entry.Size()

}

}

}

func printDiskUsage(nfiles, nbytes int64){

fmt.Printf("%d files %.1f GB\n", nfiles, float64(nbytes/1e9))

}

func cancelled() bool{

select {

case <- done:

return true

default:

return false

}

}

func main() {

flag.Parse()

roots := flag.Args()

var tick <-chan time.Time

if *verbose{

tick = time.Tick(500 * time.Millisecond)

}

if len(roots) == 0{

roots = []string{"."}

}

fileSizes := make(chan int64)

var nfiles, nbytes int64

var n sync.WaitGroup

for _, root := range roots{

n.Add(1)

go walkDir(root, &n, fileSizes)

}

go func() {

n.Wait()

close(fileSizes)

}()

go func() {

os.Stdin.Read(make([]byte, 1))

close(done)

}()

loop:

for {

select {

case <-done:

for range fileSizes{

//

}

case size, ok := <- fileSizes:

if !ok {

break loop

}

nfiles++

nbytes += size

case <- tick:

printDiskUsage(nfiles, nbytes)

}

}

printDiskUsage(nfiles, nbytes)

}


以上所述就是小编给大家介绍的《golang练手小项目系列(3)-并发读取文件夹信息》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程之法

编程之法

July / 人民邮电出版社 / 2015-9-1 / 49.00元

本书涉及面试、算法、机器学习三个主题。书中的每道编程题目都给出了多种思路、多种解法,不断优化、逐层递进。本书第1章至第6章分别阐述字符串、数组、树、查找、动态规划、海量数据处理等相关的编程面试题和算法,第7章介绍机器学习的两个算法—K近邻和SVM。此外,每一章都有“举一反三”和“习题”,以便读者及时运用所学的方法解决相似的问题,且在附录中收录了语言、链表、概率等其他题型。书中的每一道题都是面试的高......一起来看看 《编程之法》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具