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

Go 如何检查路径上的目录是否为空?,go,directory,Go,Directory,如果文件夹为空,如何签入Go?我可以这样检查: files, err := ioutil.ReadDir(*folderName) if err != nil { return nil, err } // here check len of files 但在我看来,应该有一个更优雅的解决方案。目录是否为空不作为属性存储在文件系统级别,如名称、创建时间或大小(对于文件) 这就是说,你不能仅仅从一个网站上获得这些信息。最简单的方法是查询目录的子目录(内容) 这是一个非常糟糕的选择,因为

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

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

// here check len of files 

但在我看来,应该有一个更优雅的解决方案。

目录是否为空不作为属性存储在文件系统级别,如名称、创建时间或大小(对于文件)

这就是说,你不能仅仅从一个网站上获得这些信息。最简单的方法是查询目录的子目录(内容)

这是一个非常糟糕的选择,因为它首先读取指定目录的所有内容,然后按名称排序,然后返回切片。最快的方法是DaveC提到的:使用or(最好是or)查询目录的子目录

File.Readdir()
File.Readdirnames()
都使用一个用于限制返回值数量的参数。仅查询一个子项就足够了。由于
Readdirnames()
只返回名称,因此速度更快,因为获取(和构造)结构不需要进一步调用

请注意,如果目录为空,
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
}
您可以只查看第一个目录项(如果需要跳过“.”和“.”,则可以查看第三个目录项)(如果可能有许多目录项,则会很有帮助)。但是请注意,您只能知道“如果目录是空的”,在您检查时,目录中可能有新文件。这可能是不存在这种“简单”检查的一个原因;因为它很没用。[例如,这就是为什么像
rmdir
这样的东西不检查,他们只是尝试删除目录并处理/report
enotery
,因为这是原子的。]^^^实际上(或3)会稍微好一些。
File.Readdirnames()
实现似乎基于
File.Readdir()