【问题标题】:Fast test if directory is empty快速测试目录是否为空
【发布时间】:2014-03-01 20:47:02
【问题描述】:

测试目录是否为空的最快方法是什么?

我当然可以检查长度

list.files(path, all.files = TRUE, include.dirs = TRUE, no.. = TRUE)

但这需要枚举我宁愿避免的目录的全部内容。

编辑:我正在寻找便携式解决方案。

EDIT^2:大型目录的一些时间安排(在最初为空的目录中运行,它将创建 100000 个空文件):

system.time(file.create(as.character(0:99999)))
#    user  system elapsed 
#   0.720  12.223  14.948 
system.time(length(dir()))
#    user  system elapsed 
#   2.419   0.600   3.167 
system.time(system("ls | head -n 1"))
# 0
#   user  system elapsed 
#  0.788   0.495   1.312 
system.time(system("ls -f | head -n 3"))
# .
# ..
# 99064
#    user  system elapsed 
#   0.002   0.015   0.019 

-f 开关对于ls 至关重要,它将避免否则会发生的排序。

【问题讨论】:

  • 我刚刚删除了我的 cmets(仅在 linux 上的解决方案),但您说得对,可移植性是一个不错的功能。
  • 这个问题stackoverflow.com/questions/18685576/… 有一条评论建议rmdir 如果目录非空,则“应该”失败。检查您的权限级别!
  • 是的,但是...对于空目录或“非大”目录是否更快,您更有可能遇到哪个目录? :-(
  • @CarlWitthoft:是的,对于“非大量”数据,冒泡排序比快速排序更快......我想知道,我很好奇,我已经发布了一个问题。让我们拭目以待,看看有没有好的答案。

标签: r performance directory is-empty


【解决方案1】:

if(length(dir(all.files=TRUE)) ==0) 怎么样?

我不确定你有什么资格被称为“快速”,但如果 dir 需要很长时间,那么有人在滥用你的文件系统:-(。

【讨论】:

  • OP 提到他希望避免枚举目录的全部内容(和dir == list.files)并且没有all.files = TRUE 你会错过隐藏文件
  • @dickoa 好点,抱歉。但是我看不出枚举有什么不好(因为我没有将对象返回到环境中)
  • 实际上并没有那么糟糕,但可能是 OP 只是在寻找该解决方案的更有效替代方案。我使用 linux,如果我想快速完成这类任务,我会通过 system 使用 shell。
  • @CarlWitthoft:我真的很挑剔。如果使用慢速文件系统并且目录包含许多条目,则枚举可能在性能方面并不显着。 (你称之为“滥用”,但它可能会发生。)
  • dir 比自己调用操作系统要快得多。比较 system.time(dir())system.time(system("ls", TRUE))
猜你喜欢
  • 2011-10-14
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多