package main

import (
"fmt"
"io/ioutil"
"os"
) func listDir(path string, ch chan int) {
fmt.Println("waiting ..... read path:" + path)
files, _ := ioutil.ReadDir(path)
FileSlice := []string{}
DirSlice := []string{}
for _, fi := range files {
if fi.IsDir() {
//listDir(path + "/" + fi.Name())
DirSlice = append(DirSlice, path+"/"+fi.Name())
//fmt.Println("dir:" + path + "/" + fi.Name())
} else {
FileSlice = append(FileSlice, path+"/"+fi.Name()) }
} //return slice
var count int
count = 0
//var FindFiles string
for _, value := range FileSlice {
fmt.Println("file:" + value)
//FindFiles += value + ";"
count++
} //find sub directory by go pattern
DirCount := len(DirSlice)
fmt.Println("dir len:", DirCount)
if DirCount > 0 {
DirCH := make([]chan int, DirCount)
i := 0
for _, value := range DirSlice {
fmt.Println("dir:" + value)
DirCH[i] = make(chan int)
go listDir(value, DirCH[i])
i++
} fmt.Println("wait routine return")
for _, chs := range DirCH {
returnCount := <-chs
fmt.Println("return count=", returnCount)
count += returnCount
// ReturnFiles := <-chs
// if len(ReturnFiles) > 0 {
// FindFiles += ReturnFiles + ";"
// fmt.Println("list dir chan<-" + ReturnFiles)
// }
} }
//return results
fmt.Println("count=", count)
ch <- count //FindFiles
} func main() {
if len(os.Args) < 2 {
fmt.Println("please input param of path.")
return
}
fmt.Println(os.Args[1]) path := os.Args[1] //"C:/Users/Administrator/Desktop/publish/test"
//path := "c:/QQSave"
ch := make(chan int)
go listDir(path, ch)
fmt.Println("chan<-", <-ch)
}

  

golang 实现并发计算文件数量的更多相关文章

  1. [转帖] Linux下面计算文件数量的方法

    Linux命令-查看目录下文件个数 2018年07月04日 10:37:07 sand_clock 阅读数 2002    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  2. Nginx优化_访问并发量(进程可以打开的最大文件数量)

    如果客户端访问服务器提示“Too many open files”如何解决? [root@proxy ~]# ab -n 2000 -c 2000 http://192.168.1.100/    # ...

  3. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  4. golang的并发不等于并行

    先 看下面一道面试题: func main() { runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} wg.Add(20) for i := 0; i < ...

  5. windows下计算文件的md和sha值

    在windows下可以使用FCIV命令行工具计算文件的md5和sha值,具体例子如下: FCIV -md5 -sha1 path\filename.ext 例如: FCIV-md5-sha1 c:\w ...

  6. Linux命令之查看文件夹、文件数量及其所占磁盘空间

    一.查看数量 # 查看当前目录下的文件数量(不包含子目录中的文件) ls -l|grep "^-"| wc -l # 查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表 ...

  7. Golang之并发篇

    进程和线程 A.进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. B.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. C.一 ...

  8. golang中并发sync和channel

    golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel ...

  9. [C++] 二叉树计算文件单词数

    目录 前置技能 构造和遍历二叉树 文件的打开.读取和写入 需求描述 读取文件 构建二叉树 格式化输入输出 具体实现 main.cpp binarytree.h binarytree.cpp 使用二叉树 ...

随机推荐

  1. deepin linux 下C开发环境配置

    # deepin linux 下C开发环境配置 ## 前言-----------------------------deepin操作系统商店默认提供了 eclipse for c\c++但是系统没有提 ...

  2. PHP学习笔记(13)班级和学生管理---班级

    两个文件夹,一个班级cls,一个学生stu. 两个表,一个班级cls,一个学生stu. 每个文件夹里有7个php文件:主界面cls.php-------增add.php,insert.php----- ...

  3. python 脚本撞库国内“某榴”账号

    其实日常生活中我们的用户名和密码就那么几个,所以这给撞库带来了可能,本文主要给出python脚本撞库的一点粗浅代码.这里只讨论技术本生,代码中某榴的地址也已经改掉,避免被管理员误解禁言等发生,谢谢大家 ...

  4. JS对象序列化为JSON对象的方法

    var $ = $ || {}; /** * 将JS对象序列化为JSON字符串 * @param {Mixed} o The variable to decode * @return {String} ...

  5. 每隔10秒自动更新svn 定时更新svn 脚本

    任务: */1 * * * * /opt/adobe/fms/webroot/api/svn.sh 这个命令的问题:只更新了版本号,没有更新实际内容,但是直接运行上面shell脚本能更新. 解决:需要 ...

  6. Openstack(Kilo)安装系列之neutron(九)

    控制节点 Before you configure the OpenStack Networking (neutron) service, you must create a database, se ...

  7. JavaScript修改IE注册表

    http://www.cnblogs.com/zmc/p/3373812.html <script type="text/javascript"> var obj = ...

  8. C++ TR1、TR2与boost的关系

    C++ Technical Report 1 (TR1)是ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称.TR1是一份文件,内容提出了对C++ ...

  9. Toxophily-数论以及二分三分

    G - Toxophily Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  10. VS2013\VS2017 使用git 总是需要输入账号密码

    问题: VS2013\VS2017 使用git 总是需要输入账号密码 解决方案:删除原凭证,或者修改原凭证,重新输入一次账号和密码并且选择“记住凭证”即可!