2021-05-02:给定一个文件目录的路径,写一个函数统计这个目录下所有的文件数量并返回。隐藏文件也算,但是文件夹不算 。
福大大 答案2021-05-02:
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, "\\", "/") }
执行结果如下: