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

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

问题描述:

实现一个程序计算并打印输入的目录下所有文件的总数和总大小(以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)-并发读取文件夹信息》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

ASP.NET揭秘

ASP.NET揭秘

Stephen Walther、汤涛 / 汤涛 / 中国电力出版社 / 2004-8-1 / 95.00元

本书是美国亚马逊网站同类书长期销售冠军,并受到微软ASP.NET小组项目经理Rob Howard的大力推荐,中文版由中科院专家汤涛老师翻译,经典、权威是本书最好的诠释。 本书共分10部分,31章,囊括了在.NET框架下架建ASP.NET应用程序的各个层面。每一章也都不是泛泛而谈理论,而是围绕实际样例代码来组织,让读者马上可以上手,并且加深理解。书中还包含了两个完整的、立即就可以用得......一起来看看 《ASP.NET揭秘》 这本书的介绍吧!

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

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具