[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление каталога и всех подкаталогов
Оболтус
Народ помогите пож. написать алгоритм по которому удалялся бы каталог и все его подкатологи
дерево любой структуры посторенно след. образом

Меню1(id=1, pid=0)
Под меню1.1.(id=3 pid=1)
Под меню1.2.(id=4 pid=1)
Под меню 1.2.1 (id=5 pid=4)
Под меню 1.2.2 (id=9 pid=4)
Под меню 1.2.2.1 (id=11 pid=9)
Под меню1.3.(id=7 pid=1)

т.е., если мы хотим создать подкаталог меню, то мы присваиваем под каталогу в значение pid значение id из меню
Меню1(id=1, pid=0)
Под меню1.1.(id=3 pid=1)

бъюсь уже несколько дней, все данные храняться в базе Mysql.



Спустя 1 час, 22 минуты, 46 секунд (17.01.2008 - 16:26) vasa_c написал(а):
function Удаление_Каталога_с_Подкаталогами($id)
{
Список_Подкаталогов = Получить_Список_Подкаталогов($id)
foreach(Список_Подкаталогов as Подкаталог) {
Удаление_Каталога_с_Подкаталогами(Подкаталог)
}
Удалить_Запись_из_Базы($id);
}

Если сколько-нибудь свежая версия mysql, это всё делается на её уровне связью по ключам.

И в дальнейшем вместо фраз "бьюсь несколько дней" приводите свои попытки и рассказывайте что не получилось

Спустя 1 год, 19 дней, 18 часов, 36 минут, 29 секунд (9.02.2009 - 11:02) Гость_Ольга написал(а):
Мне по работе нужно удалиьть все дочернии файлики из файловой системы и его самого (язык PHP). Вот что я родила:
// у $file_name на конце должна быть /
function RecurciveDeleteChildFiles($file_name){
if(substr($file_name, -1)!="\\")
{echo ' -- 1 -- unlink'.$file_name; unlink($file_name); return;}
$files=glob($file_name.'*',GLOB_MARK);

if(!$files)
{echo ' -- 2 -- rmdir '.$file_name;rmdir($file_name) ; return;}

foreach($files as $file)
{
RecurciveDeleteChildFiles($file);
}
echo "\r\n".' end rmdir = '.$file_name;
RecurciveDeleteChildFiles($file_name);
return;
}
Сложность в том, что если $file_name имеет дочернии доки, его rmdirом не удалить.

Спустя 29 секунд (9.02.2009 - 11:03) Guest написал(а):
Так вот вопрос. Может есть способ попроще?

Спустя 4 минуты, 36 секунд (9.02.2009 - 11:07) olgatcpip написал(а):
smile.gif

Спустя 2 часа, 4 минуты, 48 секунд (9.02.2009 - 13:12) olgatcpip написал(а):
// у $file_name на конце должна быть /
function RecurciveDeleteChildFiles($file_name){
if(!is_dir($file_name) && !is_file($file_name)){echo "\r\n".'no dir!'; return;}
if(mb_substr($file_name, -1)!="\\")
{echo ' -- 1 -- unlink'.$file_name; unlink($file_name); return;}
$files=glob($file_name.'*',GLOB_MARK);
echo "\r\n";print_r($files);
if(!$files)
{echo ' -- 2 -- rmdir '.$file_name; rmdir($file_name) ; return;}

foreach($files as $file)
{
RecurciveDeleteChildFiles($file);
}
echo "\r\n".' end rmdir = '.$file_name;
RecurciveDeleteChildFiles($file_name);
//array_walk($files, 'RMdir');
return;
//unlink(substr($file_name, 0, -1));
}
Этот более правильный
Но вопрос остался: есть попроще код удаления дочерних всех каталогов и файлов?

Спустя 1 час, 34 минуты, 50 секунд (9.02.2009 - 14:47) LoneCat написал(а):
Я-бы воспользовался SPL и написал что-то вроде этого:
PHP
function RecursiveDelete(RecursiveDirectoryIterator $oDirectory) {
    foreach($oDirectory as $oItem) {
        if($oItem->isFile()) {
            unlink($oItem->getPathname());
        } elseif($oDirectory->hasChildren()) {
            RecursiveDelete($oDirectory->getChildren());
            rmdir($oItem->getPathname());
        }
    }
}
RecursiveDelete(new RecursiveDirectoryIterator(dirname(__FILE__)));

Спустя 4 часа, 7 минут, 21 секунда (9.02.2009 - 18:54) Sylex написал(а):
LoneCat
у тебя все сайты на SPL? smile.gif
Зачем писать свое, когда уже все написано:)
Мощные итераторы wink.gif типа так?)

Спустя 1 час, 30 минут, 45 секунд (9.02.2009 - 20:25) LoneCat написал(а):
Цитата (Sylex @ 9.02.2009 - 19:54)
LoneCat
у тебя все сайты на SPL? smile.gif
Зачем писать свое, когда уже все написано:)
Мощные итераторы wink.gif типа так?)

Ну как сказать, я большой фанат ООП методологии, заметь, в недавнем топике я искал строку в файлах засчет этого-же итератора, а тут я удаляю файлы засчет него-же, тоесть итератор тут - решение-то правильное, и не будь он встроен в SPL - его по уму нужно было-бы реализовать... но так уж вышло (с прискорбием сообщаю tongue.gif) - что он встроен, писать что-то абсолютно идентичное поверх того что уже есть - действительно не лучший выход, в других алгоритмах еще можно обсудить детали реализации, а итератор он итератор и есть smile.gif Другое дело если-бы имеющееся языковое решение меня не устраивало - тогда я-бы безусловно написал свое, но в том-то и дело что меня все устраивает.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.