如果文件夹为空,如何检查Go?我可以查看:
files, err := ioutil.ReadDir(*folderName)
if err != nil {
return nil, err
}
// here check len of files
但是我觉得应该有更优雅的解决方案。
答案 0 :(得分:16)
目录是否为空未在文件系统级别存储为属性,如名称,创建时间或大小(如果是文件)。
话虽如此,您不能仅从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
}