Быстрый тест, если каталог пуст

Каков самый быстрый способ проверить, пуст ли каталог?

Конечно, я могу проверить длину

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

но для этого требуется перечислить все содержимое каталога, чего я бы предпочел избежать.

EDIT: я ищу портативные решения.

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, он позволит избежать сортировки, которая будет иметь место в противном случае.


person krlmlr    schedule 05.02.2014    source источник
comment
Я только что удалил свои комментарии (только для решений для Linux), но вы правы, переносимость - это хорошая функция.   -  person dickoa    schedule 05.02.2014
comment
Этот вопрос ?rq=1" title="php, какой лучший и самый простой способ проверить, пуст ли каталог или нет"> stackoverflow.com/questions/18685576/ имеет комментарий, рекомендующий rmdir, который должен завершиться ошибкой, если каталог непустой. Проверьте свой уровень разрешений!   -  person Carl Witthoft    schedule 05.02.2014
comment
Да, но... это быстрее для пустых или не очень больших каталогов, и с какими из них вы, скорее всего, столкнетесь? :-(   -  person Carl Witthoft    schedule 05.02.2014
comment
@CarlWitthoft: Да, и пузырьковая сортировка быстрее, чем быстрая сортировка для небольших данных ... Мне интересно, мне любопытно, я разместил вопрос. Давайте подождем и посмотрим, есть ли хороший ответ.   -  person krlmlr    schedule 05.02.2014


Ответы (1)


Как насчет if(length(dir(all.files=TRUE)) ==0) ?

Я не уверен, что вы называете «быстрым», но если dir занимает много времени, кто-то злоупотребляет вашей файловой системой :-(.

person Carl Witthoft    schedule 05.02.2014
comment
ОП упоминает, что он хочет избежать перечисления всего содержимого каталога (и dir == list.files), и без all.files = TRUE вы пропустите скрытые файлы. - person dickoa; 05.02.2014
comment
@dicko хорошая мысль, извините. Но я не понимаю, что плохого в перечислении (поскольку я не возвращаю объект в среду) - person Carl Witthoft; 05.02.2014
comment
На самом деле не так уж и плохо, но, возможно, ОП просто ищет более эффективную альтернативу этому решению. Я использую linux и для такого рода задач, если я хочу сделать это быстро, я использую оболочку через system. - person dickoa; 05.02.2014
comment
@CarlWitthoft: я действительно придираюсь. Перечисление, возможно, не заметно с точки зрения производительности, если используется медленная файловая система и каталог содержит много записей. (Вы называете это злоупотреблением, но это может случиться.) - person krlmlr; 05.02.2014
comment
dir намного быстрее, чем вызывать операционную систему самостоятельно. Сравните system.time(dir()) с system.time(system("ls", TRUE)). - person Richie Cotton; 05.02.2014
comment
Но вы все равно получите . и .., когда получите все файлы. - person James; 05.02.2014
comment
@James --- О, ну, думаю, это все еще зависит от операционной системы. - person Carl Witthoft; 05.02.2014
comment
@RichieCotton: я отредактировал свой вопрос, добавив сравнение для огромного каталога, которое показывает, что system("ls | head -n 1") может быть быстрее, чем dir(). - person krlmlr; 05.02.2014
comment
head не существует в командной оболочке Windows. Я попробовал тесты на 100 000 файлов под Win7 с локальным SSD, и я все еще считаю, что dir немного быстрее. На сетевом диске большая часть времени связана с передачей данных по сети, и не имеет значения, какое решение вы используете. Так что, как и во многих вопросах производительности, нет гарантированных побед; это зависит от вашей настройки. Интересный вопрос однако. - person Richie Cotton; 05.02.2014
comment
@RichieCotton: Извините, это должно быть ls -f, чтобы избежать сортировки. - person krlmlr; 05.02.2014
comment
Он/она хочет быть переносимым, а это не работает под Windows, если вы не добавите no.. = FALSE - person antonio; 20.05.2014