Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Не работает функция


Автор: Turik 11.3.2007, 18:10
Привет, всем форумчанам!

Неработает! Почему.. немогу найти! Помогите!!!! 

За ранее благодарен!

Функция:
Код

function full_del_dir($dir)
{
    $handle = opendir($dir);

    while (($file == readdir($handle)))
    {
        if (is_file("$dir/$file"))
        {
            unlink("$dir/$file");
        }
        elseif ((is_dir("$dir/$file")) && $file != "." && $file != "..")
        {
            full_del_dir("$dir/$file");
        }
    }
closedir($handle);
rmdir($dir); // Это line 27;

}


Ощибка:

Warning: rmdir(../img/menu/resto) [function.rmdir]: Directory not empty in C:\Program Files\Apache Group\Apache2\htdocs\www\wedding\site\library\functions.php on line 27


Автор: mishaSL 11.3.2007, 19:20
Так должно работать:
Код

<?php
function full_del_dir($dir)
{
    $handle = opendir($dir);
    while (false !== ($file = readdir($handle))) {
        if ($file != '.' && $file != '..') {
            if (is_file("$dir/$file")) {
                unlink("$dir/$file");
            } elseif (is_dir("$dir/$file")) {
                full_del_dir("$dir/$file");
            }
        }
    }
closedir($handle);
rmdir($dir); // Это line 27;
}
?>

Автор: Render 11.3.2007, 19:32
Код

foreach (glob("$directory/*.*") as $filename) 
{
    unlink($filename);
}
rmdir($directory);

Автор: Turik 11.3.2007, 20:50
Цитата(mishaSL @ 11.3.2007,  19:20)
Так должно работать:
Код

<?php
function full_del_dir($dir)
{
    $handle = opendir($dir);
    while (false !== ($file = readdir($handle))) {
        if ($file != '.' && $file != '..') {
            if (is_file("$dir/$file")) {
                unlink("$dir/$file");
            } elseif (is_dir("$dir/$file")) {
                full_del_dir("$dir/$file");
            }
        }
    }
closedir($handle);
rmdir($dir); // Это line 27;
}
?>

Спосибо!!! Работает! 

Странно, Я пробовал : while((FALSE != ($file = readdir($dir)))

Но неполучилос! А где моя ощибка? Я нехочу просто скопировать код, а понять!  

Спосибо, вам обоим ребята!

Автор: Prof_2000 11.3.2007, 21:08
Ну, код Render`a тебе,  наверное, понятен... А вот твоя ошибка в том, что вот этой строкой
Код

while (($file == readdir($handle)))

ты проверяешь, а не равен ли $file результату функции readdir($handle). В этом случае присвоения не происходит. Мало того, если директория непуста, то результат будет равен false, так как $file=0, а readdir($handle)!=0. таким образом в тело цикла ты не заходил.

mishaSL посоветовал заминить на
Код

while (false !== ($file = readdir($handle)))

тут происходит присваивание и проверяется результат. А результат оператора "=" - это присвоенное значение. То есть если директория непуста, то оно не равно 0.

Правда, хочется отметить, что достаточно напсать
Код

while ($file = readdir($handle))

потому как 0 и false тождественны. Не знаю, как в PHP, но в С написание " != false" считается плохим стилем программирования...

Автор: mishaSL 11.3.2007, 21:10
Цитата(Turik @  11.3.2007,  20:50 Найти цитируемый пост)
Я пробовал : while((FALSE != ($file = readdir($dir)))


Значит не правильно пробовал. smile

Автор: mishaSL 11.3.2007, 21:34
Цитата(Prof_2000 @  11.3.2007,  21:08 Найти цитируемый пост)
Правда, хочется отметить, что достаточно напсать
Выделить всёкод PHP
1:
    
while ($file = readdir($handle))

потому как 0 и false тождественны. 



http://ru2.php.net/readdir

Цитата:
Код

Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведенном ниже примере. В этом примере осуществляется проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа - за более подробной информацией обратитесь к главе  Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл (например, элемент с именем "0").

Автор: Prof_2000 11.3.2007, 22:39
Да, прошу прощения. Просто сам всегда писал именно так...  smile Хорошо, что контр-примеров не попадалось. Спасибо за науку.

Автор: Turik 12.3.2007, 00:52
Bolwoe vsem sposibo, rebyata!!! 
 A esli 4esno.. kod Render'a nesovsem ponyaten..  :( U koqo vremya est.. prowu pomo4.. tem kto v tanke smile


Автор: Render 12.3.2007, 01:15
Описываю. Нужна ф-ция удаления каталога. Для удаления каталога имеем встроеную ф-цию rmdir()
НО...она удаляет только пустые директории, соответственно, нужно бы прочистить всё внутри этой директории...для упрощения данной задачи, можно воспользоваться ф-цией glob. 

glob -- Находит файловые пути, совпадающие с шаблоном.

http://www.php.net/manual/ru/function.glob.php

далее имеем, ищем по шаблону *.* и удаляем всё это ф-цией unlink, воспользовавшись foreach.

ну и под конец убиваем саму директорию.

Код

$directory="../upload/$name_folder[project]";
foreach (glob("$directory/*.*") as $filename) 
{
     unlink($filename);
}
rmdir($directory);

Автор: incognito06 12.3.2007, 23:55
Господа! 
А я слышал от своей училки, что есть функция в php удаляющая не пустой каталог и при этом не надо циклить перебирая и удаляя файлы по одному.
{так вышло что она только после аварии, и в гипсе (почти вся smile) - вспомнить функцию не смогла, но заверила, что таковая имеется} 
Кто что скажет в дополнение? Может она ошиблась? А вообще: функция бы такая пригодилась - раз, и удалил каталог, одним махом(строочкой) - пустой ли полный каталог - без разницы. И никаких лишних циклов что характерно. 

Автор: Render 14.3.2007, 10:11
Есть такая ф-ция, но дается она командами ОС фактически, а с этим тоже надо уметь работать! Чревато безопасностью в не умелых руках.

Автор: incognito06 15.3.2007, 00:27
Цитата(Render @  14.3.2007,  10:11 Найти цитируемый пост)
Есть такая ф-ция, но дается она командами ОС фактически, а с этим тоже надо уметь работать! Чревато безопасностью в не умелых руках. 

   Спасибо за инфу.
Я так понимаю Вы подразумевали, что придёься писать отдельный CGA?  
И снова оговорюсь: учитель уверяла о такой функции в PHP!!! И именно с этой пометкой я спросил, не ошиблась ли она. 
Что по этому поводу думаете? Есть такая? (насколько мне известно - мануалы молчат по этому поводу, во всяком случае кроме rmdir конечно )

Автор: Render 15.3.2007, 01:55
В UNIX:

$dir=escapeshellarg($directory);
exec("rm -rf $dir");

В Винде соответственно:

$dir=escapeshellarg($directory);
exec("rmdir /s /q $dir");

Не забываем про escapeshellarg

Удалит даже не пустой каталог, но как я уже говорил всё внимание безопасности.

Автор: incognito06 15.3.2007, 03:03
Render, 
Тысяча благодарностей! 
А в каком плане тут безопасность хворает? Хотелось бы в общих чертах как ни будь поподробнее smile 
Ну и чем это всё "лечиться". Если вообще "лечиться".  smile 

Автор: Render 16.3.2007, 10:01
Не забываем про escapeshellarg, escapeshellcmd. В принципе и всё. 
Ну можно еще ф-цию написать которая бы фильтровала действия, аля не пропускала никаких команд кроме "rm" ну или других, в зависимости от нужд. Тут огромный простор для извращения. А exec мощная вещь, почитай в мане http://ru.php.net/manual/ru/ref.exec.php
Думаю сам поймешь что к чему и возможные действия ко взлому, которые помогут тебе защититься.

Как говорится идеальной защиты не существует. 

Автор: incognito06 17.3.2007, 19:03
Прочитал...
Действительно, вещь опасная, если неправильно пользоваться или без ораничений. Насколько я понял, этой функ. вообще не сильно рекомендуют пользоваться.



Цитата(Render @  16.3.2007,  10:01 Найти цитируемый пост)
Как говорится идеальной защиты не существует.  
 - Это точно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)