Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает функция, Удаление каталога 
V
    Опции темы
Turik
Дата 11.3.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.11.2005

Репутация: нет
Всего: нет



Привет, всем форумчанам!

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

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

Функция:
Код

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


PM MAIL YIM   Вверх
mishaSL
Дата 11.3.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Так должно работать:
Код

<?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;
}
?>



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Render
Дата 11.3.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



Код

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

PM   Вверх
Turik
Дата 11.3.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.11.2005

Репутация: нет
Всего: нет



Цитата(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)))

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

Спосибо, вам обоим ребята!
PM MAIL YIM   Вверх
Prof_2000
Дата 11.3.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 26.3.2005
Где: Харьков, Украина

Репутация: нет
Всего: 1



Ну, код 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" считается плохим стилем программирования...

Это сообщение отредактировал(а) Prof_2000 - 11.3.2007, 21:08
--------------------
Pereant qui ante nos nostra dixerunt! (лат.)      Да погибнут те, кто раньше нас высказал наши мысли!   
PM MAIL WWW ICQ   Вверх
mishaSL
Дата 11.3.2007, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



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


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



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
mishaSL
Дата 11.3.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



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

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



http://ru2.php.net/readdir

Цитата:
Код

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



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Prof_2000
Дата 11.3.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 26.3.2005
Где: Харьков, Украина

Репутация: нет
Всего: 1



Да, прошу прощения. Просто сам всегда писал именно так...  smile Хорошо, что контр-примеров не попадалось. Спасибо за науку.
--------------------
Pereant qui ante nos nostra dixerunt! (лат.)      Да погибнут те, кто раньше нас высказал наши мысли!   
PM MAIL WWW ICQ   Вверх
Turik
Дата 12.3.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.11.2005

Репутация: нет
Всего: нет



Bolwoe vsem sposibo, rebyata!!! 
 A esli 4esno.. kod Render'a nesovsem ponyaten..  :( U koqo vremya est.. prowu pomo4.. tem kto v tanke smile


PM MAIL YIM   Вверх
Render
Дата 12.3.2007, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



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

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

PHP Manual: GLOB >>>

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

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

Код

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


Это сообщение отредактировал(а) Render - 12.3.2007, 01:18
PM   Вверх
incognito06
Дата 12.3.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.3.2007
Где: Казахстан, Павлод ар

Репутация: нет
Всего: 1



Господа! 
А я слышал от своей училки, что есть функция в php удаляющая не пустой каталог и при этом не надо циклить перебирая и удаляя файлы по одному.
{так вышло что она только после аварии, и в гипсе (почти вся smile) - вспомнить функцию не смогла, но заверила, что таковая имеется} 
Кто что скажет в дополнение? Может она ошиблась? А вообще: функция бы такая пригодилась - раз, и удалил каталог, одним махом(строочкой) - пустой ли полный каталог - без разницы. И никаких лишних циклов что характерно. 
PM MAIL   Вверх
Render
Дата 14.3.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



Есть такая ф-ция, но дается она командами ОС фактически, а с этим тоже надо уметь работать! Чревато безопасностью в не умелых руках.
PM   Вверх
incognito06
Дата 15.3.2007, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.3.2007
Где: Казахстан, Павлод ар

Репутация: нет
Всего: 1



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

   Спасибо за инфу.
Я так понимаю Вы подразумевали, что придёься писать отдельный CGA?  
И снова оговорюсь: учитель уверяла о такой функции в PHP!!! И именно с этой пометкой я спросил, не ошиблась ли она. 
Что по этому поводу думаете? Есть такая? (насколько мне известно - мануалы молчат по этому поводу, во всяком случае кроме rmdir конечно )
PM MAIL   Вверх
Render
Дата 15.3.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



В UNIX:

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

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

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

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

Удалит даже не пустой каталог, но как я уже говорил всё внимание безопасности.
PM   Вверх
incognito06
Дата 15.3.2007, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.3.2007
Где: Казахстан, Павлод ар

Репутация: нет
Всего: 1



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

PM MAIL   Вверх
Render
Дата 16.3.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 12.5.2005

Репутация: нет
Всего: 3



Не забываем про escapeshellarg, escapeshellcmd. В принципе и всё. 
Ну можно еще ф-цию написать которая бы фильтровала действия, аля не пропускала никаких команд кроме "rm" ну или других, в зависимости от нужд. Тут огромный простор для извращения. А exec мощная вещь, почитай в мане PHP Manual: EXEC >>>
Думаю сам поймешь что к чему и возможные действия ко взлому, которые помогут тебе защититься.

Как говорится идеальной защиты не существует. 
PM   Вверх
incognito06
Дата 17.3.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.3.2007
Где: Казахстан, Павлод ар

Репутация: нет
Всего: 1



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



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

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.