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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с папками, удаление, переименовывание 
:(
    Опции темы
Bacardi
  Дата 30.1.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



... когда работал с одним единственным уровнем папок - все было зашибись....
когда же пришлось углубиться в сайт, наткнулся вот на какую лажу:
rmdir() удаляет директорию только в том случае, если она пуста... нашел на ru.php.net комменты товарисчей, мол типа их функции удаляют любые директории... потестил одну такую - теперь никак две тестируемые директории удалить не могу... пишет "диск переполнен или защищен от записи".
но основная проблема в другом.
функция другого товарисча выдает мне ошибку permissions denied при удалении... как мне ее обойти? при условии, что сижу на локальной машине и пока верстаю только сайтик.
вот листинги товарисча первого /после котого хрен удалишь/:
Код

function deleteDir($dir)
    {
   if (substr($dir, strlen($dir)-1, 1) != '/') $dir .= '/';
   if ($handle = opendir($dir)){
       while ($obj = readdir($handle)){
           if ($obj != '.' && $obj != '..'){
               if (is_dir($dir.$obj)){
                   if (!deleteDir($dir.$obj)) return false;}
               elseif (is_file($dir.$obj)){
                   if (!unlink($dir.$obj)) return false;}}}
       closedir($handle);
       if (!@rmdir($dir)) return false;
       return true;}
   return false;
    }

и второго:
Код

function SureRemoveDir($dir) {
   if(!$dh = opendir($dir)) return;
   while (($obj = readdir($dh))) {
     if($obj=='.' || $obj=='..') continue;
     if (!unlink($dir.'/'.$obj)) {
         SureRemoveDir($dir.'/'.$obj);
     } else {
         $file_deleted++;
     }
   }
   if (rmdir($dir)) $dir_deleted++;


винда хр, апаче 2.0.55, пшп 4.4.0

Это сообщение отредактировал(а) Bacardi - 30.1.2006, 17:23
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Danox
Дата 30.1.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


=)
*


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

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



Ну если я не ошибаюсь надо php.ini покапатся smile диск защищен от записи сам подумай php скрипт удаляет дериктории smile
Вроде была статейка по настройке этого дела smile

Это сообщение отредактировал(а) Danox - 30.1.2006, 17:34
PM MAIL   Вверх
Bacardi
Дата 30.1.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Danox
акей. поищу. спасибо!
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
BIG BROTHER
Дата 30.1.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



такие ошибки могут указывать, что запрещено удаление. Если винда, то не стоит-ли случайно read-only ?

Добавлено:

например, первая функция у меня даже при error_reporting E_ALL сработала отлично с очень глубокой вложенностью

Это сообщение отредактировал(а) BIG BROTHER - 30.1.2006, 17:41
--------------------
Mess with the best, die like the rest
PM MAIL ICQ   Вверх
Bacardi
Дата 30.1.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



BIG BROTHER
папки я создал этим же скриптом... никаких специальных аттрибутов не ставил... врядли стоит ридонли... ведь переименовывает.
Добавлено @ 17:41
Danox
не нашел smile((
Добавлено @ 17:43
BIG BROTHER
эээээ... чо за делы?!
может у тебя какие-то другие настройки... хз чего стоят?) я просто не знаю где это надо настраивать... по идее в апаче... он же дает разрешения на разные операции, отслеживает их и т.п.
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 31.1.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Модератор: зачем создавать две темы

Bacardi, тебя в МПТ не научили чтоли пробовать?
Не пустая директория спокойно переименовывается.
Не пустая директория может быть удалена, через system вызовом команды shell или рекурсивных обходом, который уже давно лежит в FAQ.
PM ICQ   Вверх
Bacardi
Дата 31.1.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Mal Hack @ 31.1.2006, 19:19 Найти цитируемый пост)

Bacardi, тебя в МПТ не научили чтоли пробовать?

ой... надо же... утечка информации прошла.)
Цитата(Mal Hack @ 31.1.2006, 19:19 Найти цитируемый пост)

Не пустая директория спокойно переименовывается.

мысль, что не может спокойно переименовываться ко мне пришла в голову после того, как rmdir() переименовывал спокойно пустую, а на не пустой той же директории выписывалось permission denied smile
Цитата(Mal Hack @ 31.1.2006, 19:19 Найти цитируемый пост)

Не пустая директория может быть удалена, через system вызовом команды shell или рекурсивных обходом, который уже давно лежит в FAQ.

такому меня в мпт точно не учили smile(((
пошел в фак читать.
спасибо.
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 31.1.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Bacardi вообще-то это в любом языке так. Я про удаление не пустой директории.. Нужен рекурсивный обход.
PM ICQ   Вверх
Bacardi
Дата 31.1.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Mal Hack
а почему rename при переименовывании не пустой дир, пишет permission denied?
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
mr.fox
Дата 31.1.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Bacardi.. потому что доступа нету!
PM MAIL WWW ICQ   Вверх
Bacardi
Дата 31.1.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



mr.fox
на этой директории права доступа: drwxrwxrwx... php ее создал... почему создать может, пустую переименовать может, пустую удалить может, а переименовать забитую нет?
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Bacardi
Дата 1.2.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Фокс-покус! Или проведем эксперимент!

Создаю директории кодом (из мозгов):
Код

<?
mkdir('test');
chdir('test');
mkdir('test1');
mkdir('test2');
chdir('test1');
mkdir('test11');
mkdir('test12');
echo 'директория успешно создана<br>';
?>

после запускаю код (из фака винграда) /1/:
Код

$perms = fileperms($_GET['dir']);
if (($perms & 0xC000) == 0xC000) {
   $info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
   $info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
   $info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
   $info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
   $info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
   $info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
   $info = 'p';
} else {
   $info = 'u';}
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
           (($perms & 0x0800) ? 's' : 'x' ) :
           (($perms & 0x0800) ? 'S' : '-'));
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
           (($perms & 0x0400) ? 's' : 'x' ) :
           (($perms & 0x0400) ? 'S' : '-'));
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
           (($perms & 0x0200) ? 't' : 'x' ) :
           (($perms & 0x0200) ? 'T' : '-'));
echo $info."<br>";
?>

проверяю его для всех директорий, мне выводит:
drwxrwxrwx
запускаю код (http://ru.php.net/manual/ru/function.rmdir.php) /2/:
Код

<?
error_reporting(2047);
function rmdirr($dir) {
   if($objs = glob($dir."/*")){
       foreach($objs as $obj) {
           is_dir($obj)? rmdirr($obj) : unlink($obj);
       }
   }
   rmdir($dir);

rmdirr("test");
?>

И НИХРЕНА НЕ УДАЛЯЕТ!!!

создаю похожую структуру папок в проводнике windows xp sp2:
Код

пр. кн. мыши - создать - папку

после запускаю код (из фака винграда) /1/, получаю для всех директорий:
drwxrwxrwx
запускаю код (http://ru.php.net/manual/ru/function.rmdir.php) /2/, который мне все замечательно удаляет.

Вопрос: мне нажраться пойти или я чего-то не понимаю?
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.2.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Bacardi у тебя что винда северной версии? В несерверной прав доступа нет, т.е. нот они не стандартные.
PM ICQ   Вверх
Bacardi
Дата 1.2.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Mal Hack
да нет... не серверная... простая win xp professional...
ну скажи что не так?! почему не работает?! ну нельзя на папках вторые сутки сидеть!!!! smile
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.2.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Возьми отсюда ( http://vingrad.ru/PHP-ART-002993 ) рекурсию и на нее вешай удаление.
Тут стоит оговориться, что на винде глючить может несчадно.
PM ICQ   Вверх
Ciber SLasH
Дата 2.2.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



2Bacardi:
Вот, проверь:
Код

$slash = (substr(PHP_OS, 0,3) == 'WIN') ? '\\' : '/';
////////////////////////////////////////////////////////////////////////////////
function removeTree($dir) {
global $slash;
    if ($dh = opendir($dir)) {
        while ( ($fh = readdir($dh)) !== false ) {
            if ($fh != '.' && $fh != '..') {
                if (!@unlink($dir.$slash.$fh)) {
                    if (!removeTree($dir.$slash.$fh)) return false;
                }
            }
        }
        closedir($dh);
        if (!rmdir($dir)) return false;
        return true;
    }
return false;
}
////////////////////////////////////////////////////////////////////////////////
echo removeTree('J:\test');

PM   Вверх
Bacardi
Дата 2.2.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ciber SLasH
выводит ошибку:
Warning: rmdir(test\test1): Directory not empty in E:\SKS_WEB\sks-lighting.ru\www\remove.php on line 14
Добавлено @ 21:47
он попытался удалить папку второго уровня, а уровней 3!
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Ciber SLasH
Дата 3.2.2006, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



2Bacardi:
Приведи пожалуйства список каталогов и количества в них файлов на которых происходило тестирование.
Просто у меня с несколькими уровнями вложения всё нормально удалилось.
Добавлено @ 1:30
Переделал функцию, проверь ещё разок:
Код

$slash = (substr(PHP_OS, 0,3) == 'WIN') ? '\\' : '/';
////////////////////////////////////////////////////////////////////////////////
function removeTree($dir) {
global $slash;
    if ($dh = opendir($dir)) {
        while ( ($fh = readdir($dh)) !== false ) {
            if ($fh != '.' && $fh != '..') {
                if ((fileperms($dir.$slash.$fh) & 0x4000) == 0x4000) {    // если директория
                    if (!removeTree($dir.$slash.$fh)) return false;
                } else {
                    if (!@unlink($dir.$slash.$fh)) {
                        if (chmod($dir.$slash.$fh, 0777)) {
                            if (!@unlink($dir.$slash.$fh)) return false;
                        } else {
                            return false;
                        }
                    }
                }
            }
        }
        closedir($dh);
        if (!@rmdir($dir)) {
            if (chmod($dir, 0777)) {
                if (!rmdir($dir)) return false;
            } else {
                return false;
            }
        }
        return true;
    }
return false;
}
////////////////////////////////////////////////////////////////////////////////
set_time_limit(0);
echo removeTree('J:\Documents and Settings');

Проверял на удалении папки "Documents and Settings" (весит почти 500 метров), а там очень большая вложенность директорий встречается. Результат: удалил всё нафиг.

Это сообщение отредактировал(а) Ciber SLasH - 3.2.2006, 01:33
PM   Вверх
Bacardi
Дата 3.2.2006, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



что ж у меня все не как у людей?!?!?
результат:
Warning: rmdir(test\test1): Directory not empty in E:\SKS_WEB\sks-lighting.ru\www\remove.php on line 24

дерево:
user posted image

Это сообщение отредактировал(а) Bacardi - 3.2.2006, 04:06
--------------------
Необычная смесь. Болтать, но не мешать.http://www.livejournal.com/users/__bacardi__/
PM MAIL WWW ICQ   Вверх
Ciber SLasH
Дата 3.2.2006, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хм, проверил даже в сети на бесплатном хостинге (у них там FreeBSD) на тестовой папке с несколькими уровнями вложенности — всё удалилось начисто...
Добавлено @ 06:12
Кстати, прикрепи архив папки, на которой ты тестировал, а я залью себе на "тестовый сайт" и протестю там.
PM   Вверх
Mal Hack
Дата 3.2.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Bacardi не забывай, в винде все это несколько не так работает.
К примеру на моей машине при rename писал "директория не найдена", при этом прекрасно переименовывал.
PM ICQ   Вверх
AnikinAlexey
Дата 17.3.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у меня похожая трабла. 
Скрипт создает такую структуру папок: 
                         папка1\папка11
                         папка1\папка12
                         папка1\файл.фл
во вложенные папки копируются файлы во время работы ...
после тем же скриптом пытаюсь все удалить.
для этого сначала удаляю файлы из вложенных папок и удаляю их.
после удаляю файл (папка1\файл.фл) - он не удаляется (доступ 644, на папке 755)
соответственно и не удаляется главная папка.

подскажите что может быть не так?

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


Шустрый
*


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

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



Тема

И с правами проблем тоже нет.

Это сообщение отредактировал(а) Render - 18.3.2007, 01:08
PM   Вверх
Страницы: (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.

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


 




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


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

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