Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: удаление не пустого каталога

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: подскажите плз где не прав
4ygo
Отправлено: 16 Августа, 2010 - 22:52:55
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




в общем, идея такова:
цель - создать каталог и записать в него изображения, но сначала нужно проверить есть ли такой каталог, и если он присутствует - удалить со всем содержимым.
в php я ток начинаю разбираться(переделываю платный скрипт под свои нужды, а то там много чего мне не хватает), так что - вот что нарыл в инете и вообще...
1 вариант, который нашел..с переделками типа))
PHP:
скопировать код в буфер обмена
  1.  
  2. //мудрим с каталогами
  3. //удаляем ранее созданный НЕ пустой каталог, если он существует
  4.    $deldir = "$fotodir/$id";
  5.   function full_del_dir ($deldir)
  6.   {
  7.   $dir = opendir($deldir);
  8.   while(($file = readdir($dir)))
  9.   {
  10.     if ( is_file ($deldir."/".$file))
  11.     {
  12.       unlink ($deldir."/".$file);
  13.     }
  14.     else if ( is_dir ($deldir."/".$file) &&
  15.              ($file != ".") && ($file != ".."))
  16.     {
  17.       full_del_dir ($deldir."/".$file);
  18.     }
  19.   }
  20.   closedir ($dir);
  21.   rmdir ($deldir);
  22.   echo("Каталог успешно удален");
  23.   }
  24.   full_del_dir ($deldir)
  25. //////////////
  26. @mkdir("$fotodir/$id", 0771); //создадим каталог фото
  27.  


2 вариант, который нашел..с переделками тоже))
PHP:
скопировать код в буфер обмена
  1.  
  2. //мудрим с каталогами
  3. //удаляем ранее созданный НЕ пустой каталог, если он существует
  4. $deldir = "$fotodir/$id";
  5. if (is_dir("$deldir")) {
  6.         // открываем каталог
  7.         if ($dd = opendir("$deldir")) { if ($file = readdir($dd) !== false)
  8. {function dd($file) {
  9.  if (file_exists($file)) {
  10.  chmod($file,0777);
  11.  if (is_dir($file)) {
  12.  $handle = opendir($file);
  13.  while($filename = readdir($handle))
  14.  if ($filename != "." && $filename != "..") dd($file."/".$filename);
  15.  closedir($handle);
  16.  rmdir($file);}
  17.  else {unlink($file);}
  18.  }
  19.  }
  20. closedir($dd);}}};
  21. if (is_dir("$deldir")) { rmdir("$deldir");};
  22.  
  23. //////////////
  24. @mkdir("$fotodir/$id", 0771); //создадим каталог фото
  25.  



я походу тут везде ошибок наделал( короче... в обоих случаях пишет что не могу удалить каталог ибо он не пустой, ну и создать тоже не может, ибо каталог создан...
просьба указать на ошибку...ну и какой вариант применить)

(Отредактировано автором: 16 Августа, 2010 - 22:54:25)

 
 Top
JustUserR
Отправлено: 17 Августа, 2010 - 01:36:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




4ygo пишет:
Я походу тут везде ошибок наделал( короче... в обоих случаях пишет что не могу удалить каталог ибо он не пустой, ну и создать тоже не может, ибо каталог создан
Используемые вами функции предоставляют правильный способ рекурсивного удаления каталогов который должен успешно работать - однако причиной проблемы может быть указание неправильного относительного файлового пути по отношению к рабочей директории или отсутствие требуемых прав доступа Причиной недостатка уровня доступа может быть ситуация когда файлы располагаемые на вашем web-ресурсе принадлежат разным пользователям - например отдельно вашему системному пользователю под именем которого вы загружаете файлы на FTP-сервер - и отдельно пользователю от имени которого исполняются PHP-скрипты такому как www-data


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
4ygo
Отправлено: 17 Августа, 2010 - 08:41:30
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




JustUserR пишет:
причиной проблемы может быть указание неправильного относительного файлового пути по отношению к рабочей директории или отсутствие требуемых прав доступа Причиной недостатка уровня доступа может быть ситуация когда файлы располагаемые на вашем web-ресурсе принадлежат разным пользователям

1)про пользователей - проверю. Файлы в каталоге лежат с атрибутом 666. Поставлю 777 и попробую, если причина в этом, должно заработать. Только как с этим бороться потом - не понятно...но сначала проверю(вчера еще хотел так сделать)хотя, мы же используем
так что не понимаю. а если владелец я, а www-data не может даже менять атрибуты, какой атрибут должен быть у файла, чтобы ОН смог менять атрибуты?
2)про относительный путь. $fotodir="./datafoto", и соответственно, когда получается путь, типа "./datafoto/1001289". Может нужно прописывать chdir? или я не догоняю что такое рабочая директория?) или я не правильно задаю переменную?(я в синтаксисе не уверен совсем) мб надо типа как ниже?
самое страшное то, что это не самая важная проблема( ладно - бум решать по порядку!

а вообще мне вроде бы нравится второй мой вариант(вроде попроще). может я допустил ошибку в логике или не правильно написал что-то(хотя ошибок вроде не выдает,но хз). я писал когда, брал строки из разных примеров, и возможно не правильно их соединил((

(Отредактировано автором: 17 Августа, 2010 - 09:27:12)

 
 Top
Slavenin
Отправлено: 17 Августа, 2010 - 10:34:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




для начала определись с путем, где конретно лежат файлы, может быть надо как-то так:

 
 Top
4ygo
Отправлено: 17 Августа, 2010 - 10:42:33
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




Slavenin пишет:
для начала определись с путем, где конретно лежат файлы, может быть надо как-то так:


у меня вот так. просто она обозначена как глобальная
CODE (htmlphp):
скопировать код в буфер обмена
  1. $fotodir="./datafoto"

каталог по $fotodir у меня создается(если он ранее не был создан)
посмотрите плиз на правильность кода. я совсем не уверен что он правильно собран
 
 Top
Slavenin
Отправлено: 17 Августа, 2010 - 14:02:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




итак, первое, у тебя отсутвовала последняя закрывающая скобка в конце. Дальше, объявление функции внутри условия возможно но не желательно, она тебя будет переобъявляться каждый раз если вдруг ты засунешь условие в цикл, поэтому фнкции надо объявлять вне каких либо условий и циклов. Скачай себе редактор php и юзай его, я, например пользуюсь pspad, самое большое его достоинство что он умеет подсвечивать парные скобки, в нем есть русский язык и полностью настраиваемый синтаксис. В месте где у тебя функция объявляется должен следовать ее вызов. Старайся не делать одинаковые и/или бессмысленные имена функций и переменных, сам потом запутаешься. Ну и код, наверно, должен выглядеть как-то так:
PHP:
скопировать код в буфер обмена
  1. function dd($file)
  2.         {
  3.           if (file_exists($file))
  4.           {
  5.             chmod($file,0777);
  6.             if (is_dir($file))
  7.               {
  8.                 $handle = opendir($file);
  9.                 while($filename = readdir($handle))
  10.                  
  11.                   if ($filename != "." && $filename != "..")
  12.                   {
  13.                     dd($file."/".$filename);
  14.                   }
  15.                  
  16.                 closedir($handle);
  17.                 rmdir($file);
  18.               }
  19.             else
  20.               {
  21.                unlink($file);
  22.               }
  23.           }
  24.         }
  25.        
  26. $deldir = "$fotodir/$id";
  27. if (is_dir("$deldir"))
  28.  {
  29. // открываем каталог
  30.    if ($dd = opendir("$deldir"))
  31.    {
  32.     if ($file = readdir($dd) !== false)
  33.       {
  34.         dd($file);
  35.         closedir($dd);
  36.       }
  37.     }
  38.     if (is_dir("$deldir"))
  39.     {
  40.       rmdir("$deldir");
  41.     }
  42.   }
  43. //////////////
  44. mkdir("$fotodir/$id", 0771); //создадим каталог фото


То что написал не тестил, негде. Проверь сам.

Да и старайся не использовать символ @ стоящий перед функцией он блокирует сообщения об ошибках исходящие от нее. Старайся писать код более структурно, чтоб самому было понятно Улыбка
 
 Top
4ygo
Отправлено: 17 Августа, 2010 - 18:50:29
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




о боги! свершилось!!!

PHP:
скопировать код в буфер обмена
  1. function dd($delfile)
  2.         {
  3.           if (file_exists($delfile))
  4.           {
  5.             chmod($delfile,0777);
  6.             if (is_dir($delfile))
  7.               {
  8.                 $handle = opendir($delfile);
  9.                 while($filename = readdir($handle))
  10.  
  11.                   if ($filename != "." && $filename != "..")
  12.                   {
  13.                     dd($delfile."/".$filename);
  14.                   }
  15.  
  16.                 closedir($handle);
  17.                 rmdir($delfile);
  18.               }
  19.             else
  20.               {
  21.                unlink($delfile);
  22.               }
  23.           }
  24.         }
  25.  
  26. $deldir = "$fotodir/$id";
  27. if (file_exists($deldir)) {dd($deldir);}

Slavenin спасибо за помощь!
вот почему все описания на обучающих сайтах делаются так "отстраненно"? писали бы :
1)имеем код такой-то. (комментами что и где он делает)
2)задача - такая-то и такая-то
3)используем такие-то функции
4)смотрите как и куда что вставляем

а тут тратишь на удаление какого-то каталога сутки, и все эти сутки чуствуешь себя полным дауном)

решил добавить для таких как я
PHP:
скопировать код в буфер обмена
  1. function dd($delfile) //обзываем функцию. ниже- порядок ее действий
  2.         {
  3.           if (file_exists($delfile)) //если файл/каталог создан - продолжай
  4.           {
  5.             chmod($delfile,0777); //выстави атрибут на файл/каталог 777,т.е. полный доступ
  6.             if (is_dir($delfile)) //если это каталог - продолжай,если файл - выполни действия после "else"
  7.               {
  8.                 $handle = opendir($delfile); //открой каталог
  9.                 while($filename = readdir($handle)) //цикл чтения и запись всего в переменную
  10.  
  11.                   if ($filename != "." && $filename != "..") //в явном виде отменяем запись в переменную текущий и родительсткий каталоги, чтобы не потерять нужные данные
  12.                   {
  13.                     dd($delfile."/".$filename); //удаляем файлы в каталоге          
  14.                   }
  15.  
  16.                 closedir($handle); //закрываем каталог                  
  17.                 rmdir($delfile);  //удаляем уже пустой каталог
  18.               }
  19.             else                   //если это все таки это не каталог
  20.               {
  21.                unlink($delfile);    //удали файл
  22.               }
  23.           }
  24.         }
  25. //функция определена. можно вставять в код. ниже -определение параметров(удаляемый каталог) и вызов функции
  26. $deldir = "$fotodir/$id";             //задаем переменной нужный нам каталог. можно путь в явном виде. в данном примере подразумевается что $fotodir и $id заданы раньше:)
  27. if (file_exists($deldir)) {dd($deldir);}    //если находим его - удаляем

удаляет каталог,файлы в нем и ВСЕ подкаталоги - надеюсь кому-нить поможет

(Отредактировано автором: 18 Августа, 2010 - 07:43:42)

 
 Top
JustUserR
Отправлено: 17 Августа, 2010 - 22:00:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




4ygo пишет:
chmod($delfile,0777); //выстави атрибут на файл/каталог 777,т.е. полный доступ
Несмотря на то что в большом числе PHP-функций которые осуществляют рекурсивное удаления дерева папок используется функция chmod - но на самом деле ее применение не дает никакого дополнительного эффекта по следующим причинами Во-первых если указанных ресурс в файловой системе принаждежит пользователю отличному от эффективного владельца данного процесса - то изменение прав доступа не будет происходить вообще вне зависимости от дополнительных условий наличия доступа к родительским ресурсам Во-вторых возможность удаления файлов из папки обеспечивается ее правом на запись для текущего пользователя - если оно имеется то удаление всех файлов их данной директории будет производиться вне зависимости от их параметров - поскольку происходит удаление только жесткой ссылки а не реального объекта Что касается удаления вложенных директорий то для них такая схема напрямую неприменима - дело в том каждая папка содержит специальный файл <точка> ссылающийся на нее саму - и соответственно если вложенная директория принадлежит другому пользователю то она содержит и файл <точка> находящийся также в его владении - удалит файл невозможно поскольку нет прав на содержащую его директорию а удалить ее саму нельзя поскольку она содержит вложенный файл


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB