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, "\\", "/")
}

执行结果如下:
图片


左神java代码