如何检查路径上的目录是否为空?

Pao*_*aJ. 7 directory go

如果文件夹为空,如何检查Go?我可以检查:

files, err := ioutil.ReadDir(*folderName)
if err != nil {
    return nil, err
}

// here check len of files 
Run Code Online (Sandbox Code Playgroud)

但是我觉得应该有更优雅的解决方案.

icz*_*cza 17

目录是否为空不会在文件系统级别存储为名称,创建时间或大小(如果是文件)等属性.

话虽如此,你不能只是从中获取这些信息os.FileInfo.最简单的方法是查询目录的子项(内容).

ioutil.ReadDir()是一个非常糟糕的选择,因为它首先读取指定目录的所有内容,然后按名称对它们进行排序,然后返回切片.最快的方法是Dave C提到:使用File.Readdir()或(最好)查询目录的子节点File.Readdirnames().

二者File.Readdir()File.Readdirnames()采取其用于限制返回值的数量的参数.仅查询1个孩子就足够了.由于Readdirnames()只返回名称,因此更快,因为不需要进一步调用来获取(和构造)FileInfo结构.

请注意,如果目录为空,io.EOF则返回错误(而不是空或nil切片),因此我们甚至不需要返回的名称切片.

最终的代码可能如下所示:

func IsEmpty(name string) (bool, error) {
    f, err := os.Open(name)
    if err != nil {
        return false, err
    }
    defer f.Close()

    _, err = f.Readdirnames(1) // Or f.Readdir(1)
    if err == io.EOF {
        return true, nil
    }
    return false, err // Either not empty or error, suits both cases
}
Run Code Online (Sandbox Code Playgroud)