给定一个文件目录的路径,写一个函数统计这个目录下所有的文件数量并返回。隐藏文件也算,但是文件夹不算 。
1.用filepath.Walk方法。
2.用广度优先遍历+ioutil。
代码用golang编写。代码如下:
package main
import (
"container/list"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
)
func main() {
ret := getFileNumber1("D:\\mysetup\\gopath\\src\\sf\\newclass")
fmt.Println("1.用filepath.Walk方法:", ret)
ret = getFileNumber2("D:\\mysetup\\gopath\\src\\sf\\newclass")
fmt.Println("2.用广度优先遍历+ioutil:", ret)
}
func getFileNumber1(folderPath string) int {
folderPath = toLinux(folderPath)
info, err := os.Lstat(folderPath)
//既不是文件,也不是文件夹
if err != nil {
return 0
}
//如果是文件
if !info.IsDir() {
return 1
}
//如果是文件夹
ans := 0
filepath.Walk(folderPath, func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
ans++
return nil
})
//返回结果
return ans
}
func getFileNumber2(folderPath string) int {
folderPath = toLinux(folderPath)
info, err := os.Lstat(folderPath)
//既不是文件,也不是文件夹
if err != nil {
return 0
}
//如果是文件
if !info.IsDir() {
return 1
}
//文件夹添加到队列里
ans := 0
queue := list.New()
queue.PushBack(folderPath)
for queue.Len() > 0 {
files, _ := ioutil.ReadDir(queue.Front().Value.(string))
for _, file := range files {
if file.IsDir() {
queue.PushBack(filepath.Join(folderPath, file.Name()))
} else {
ans++
}
}
queue.Remove(queue.Front())
}
//返回结果
return ans
}
func toLinux(basePath string) string {
return strings.ReplaceAll(basePath, "\\", "/")
}
执行结果如下: