1

我想知道一个文件夹中有多少文件(特别是 Windows 上的共享网络文件夹,如果这在这里有所不同的话)。

我现在正在使用此代码:

include os.path
def countFiles(path):
    return len([f for f in os.listdir(path)
                if os.path.isfile(os.path.join(path, f))])

当文件夹中有几个文件时它工作正常,但在有很多文件的目录中需要很长时间(比如 4000)。我经常运行这个(文件每 15 秒添加一次),所以减速很痛苦。

在我的特殊情况下,我知道没有任何子文件夹,所以我可以跳过os.path.isfile检查,但我想保持我的解决方案通用。坦率地说,我很惊讶 os.path 上没有内置的 # of files 函数。

4

1 回答 1

9

为了知道一个文件夹中有多少个文件,系统必须枚举每个条目,然后它必须检查一个条目是否是一个文件。fsevent除非系统为您提供文件系统事件(例如或eventfd)来告诉您事情何时发生变化,否则没有更快的方法。

这些操作对于基于磁盘的文件系统来说很慢(几十到几百微秒),在网络驱动器上甚至更慢;您会注意到即使在普通文件浏览器中它们也很慢。现代操作系统通过积极缓存来处理缓慢,但这有其局限性(特别是对于网络文件系统,保持缓存新鲜的开销可能首先超过执行操作的成本)。

为了加快速度,您可以缓存isfile您已经检查过的名称的结果,假设它们不会转化为目录。这会为您节省许多isfile检查,但会牺牲一点安全性(例如,如果有人删除了一个文件并将其替换为同名文件夹)。

于 2013-09-07T16:38:23.650 回答