Проверка пустоты каталога

maxim

Новичок
Проверка пустоты каталога

Как проверить пустой ли каталог.
Для последующего его удаления если это так, и оставления в противном случае.
Я кроме как

$fh = opendir('path_to_dir');
while (false !== ($filename = readdir($fh)) and ($filename == '.' or $filename == '..')) {

}
$empty = ($filename)? false:true;//в empty мы теперь имеем что нам нужно
closedir($fh);

ничего не придумал.

Пробовал scandir - но у меня пхп4хх.
Проверять пустоту через empty = rmdir('path_to_dir') приятно(он как раз делает что мне нужно удаляет папку если она пустая и не трогает ее в противном случае), но если папка не пустая генерируется варнинг (который меня отнюдь не радует).

Порадуйте, пожалуйста, изящным решением.
 

jer

...
ну засобач (@) rmdir и проверяй возвращаемое значение.
 

Profic

just Profic (PHP5 BetaTeam)
PHP:
$dh = opendir('path_to_dir');
$empty = true;
while ($file = readdir($dh))) {
    if ($file != '.' && $file != '..') {
        $empty = false;
        break;
    }
}

var_dump ($empty);
 

TuBu

Guest
PHP:
$out = `ls path_to_dir`;
if (!$out) {
  echo "Dir is not empty";
}
-----------------------------

Хотя ну его в баню, писать скрипты, привязанные к платформе
 

Profic

just Profic (PHP5 BetaTeam)
Если, учитывать, что есть хостеры, которые юзают php <4.3 то с этим вариантом могут возникнуть проблемы...
 

zumo

Guest
PHP:
if(@rmdir('path'))
{
   mkdir('path');
   $pusto=1;
}
else
   $pusto=0;
 

Gas

может по одной?
Zumo
Права у существовавшего и вновь созданного каталога могут быть разными.

p.s. сори, если по вопросу всё ok.
 

DimbIch

Новичок
просто rmdir(path_to_dir);
если он пустой то удалиться - а если нет то останеться :)
смысл его проверять то ?:)
 

zumo

Guest
задача была поставлена "Проверка пустоты каталога" а не "Проверка пустоты каталога и если он пуст то удалить"
а насчёт прав так можно их узнать у папки перед удалением а потом на вновь созданой поставить
 

DimbIch

Новичок
Re: Проверка пустоты каталога

Автор оригинала: maxim
Как проверить пустой ли каталог.
Для последующего его удаления если это так, и оставления в противном случае.
значит я что-то не понимаю в словах....
Проверить и если пуст - УДАЛИТЬ..а если нет - оставить
что и делает rmdir
 

sergadm

Новичок
Re: Re: Проверка пустоты каталога

Автор оригинала: DimbIch
значит я что-то не понимаю в словах....
Проверить и если пуст - УДАЛИТЬ..а если нет - оставить
что и делает rmdir
внимательнне читайте вопрос об этой команде автор топика знает. ему не нравится генерация варнинга этой командой.
 

maxim

Новичок
Просто rmdir генерирует warning, а сточки зрения правильности программирования сие есть не очень хорошо.
(хотя на рабочем сайте, ежу понятно, у меня вообще вывод всех ошибок отключен.) Использовать костыль типа @rmdir нет желания по тем же причинам.
 

Profic

just Profic (PHP5 BetaTeam)
maxim
Тогда тебе в мой первый пост в этом топике или в пост AKAPE, в зависимости от планируемой совместимости с версией php.
 

Gas

может по одной?
Чтоб просто проверить пуст каталог или нет AKAPE дал вполне красивое решение.

только
PHP:
$is_empty = count(glob('path_to_dir/*')) ? false : true;
 

Profic

just Profic (PHP5 BetaTeam)
Gas
Но не стоит забывать, что этот код будет работать только под php > 4.3.0 под юниксами и > 4.3.3 под виндами.
О чем я собственно и написал в своем посте после поста AKAPE
 

Gas

может по одной?
Я и не забываю.
Но IMHO это уже достаточно старые версии для _нормального_ хостинга
 

maxim

Новичок
Вопрос а в эту * входит . и ..
Пойду проверять.

-~{}~ 08.11.04 16:49:

Еще есть одна тонкость(правда не принципиальная):
глоб будет выбирать все файлы в каталоге.
в то время как цикл с реаддиром прервется на первом файле отличном от . и ..

Думаю вариантов больше нет.

Действительно стоит начинать смотреть в сторону php5.
Там в связке try catch вариант с rmdir не является плохим тоном. Или я не прав?
 

Profic

just Profic (PHP5 BetaTeam)
Является, т.к. только новые для php5 расширения используют исключения - все остальные работают по старинке - т.е. тот же самый warning тебе обеспечен :)
 

MICKRON

Новичок
хм... а зачем писать:

$b = <условие> ? false : true;

ведь в этом случае можно просто

$b = !<условие>;
 
Сверху