Скрипты, разработка, настройка, администрирование
Модераторы: dobs, ArniXXX, hostess, bj
-
oleg000_som
- Сообщения: 3
- Зарегистрирован: Ср дек 29, 2010 17:37
- Откуда: Украина
-
Контактная информация:
#1
Сообщение
oleg000_som » Сб янв 01, 2011 17:07
Всем привет, делаю файловый менеджер. Относительно, я новичок в php. Загрузка файлов и создание каталогов успешно проходит. Сейчас реализовываю скрипт удаления файлов и каталогов. Скрипт состоит из 2х страниц. Первая занимается тем, что отображает содержимое основного каталога с файлами мой_сайт/files , а также обеспечивает переход по вложеным каталогам и отображает их содержимое. С помощью формы можно выделить каталог или файл и отправить его в на удаление на 2ю страницу. Удаление файлов происходит без проблем. Больше мороки с каталогами. Вот код отвечающий за удаление каталогов.
Код: Выделить всё
if (isset($_POST['delete']) and isset($_POST['dir_name']) and !empty($_POST['dir_name'])){
$dir_name = $_POST['dir_name']; /*полный локальный путь директории*/
$delete = @rmdir($dir_name);
if ($delete != false) { /*если удаление успешно - оповестить об этом*/
echo "Каталог ".$dir_name." успешно удален!";
echo "<p><a href='http://test/del.php'>На начало</a></p>";
}
else { /*иначе - открыть директорию удалить все файлы и опять попытаться удалить директорю*/
$op_dir=opendir($dir_name);
while($file=readdir($op_dir )){
if ($file != "." && $file != ".." && strstr($file, ".")){
unlink ($dir_name."/".$file);
}
}
closedir($dir_name);
$delete = @rmdir($dir_name);
if ($delete != false) { /*если удаление успешно - оповестить об этом*/
echo "Каталог ".$dir_name." успешно удален, хоть в нем и содержались данные";
echo "<p><a href='http://test/del.php'>На начало</a></p>";
}
else { /*если удаление не успешно - оповестить об этом*/
echo "Ошибка, каталог какого-то хера не удалился";
echo "<p><a href='http://test/del.php'>На начало</a></p>";
}
}
}
Если каталог пустой - удаление происходит успешно. Если каталог не пустой - скрипт удаляет все файлы в каталоге и пытается повторить попытку, но безуспешно. Короче удаляет только пустые каталоги, а каталоги с файлами не удаляет - файлы удаляет а каталоги нет...
Что я делаю не так?
Последний раз редактировалось
oleg000_som Пн янв 03, 2011 19:04, всего редактировалось 1 раз.
-
dobs
- HO Moderators
- Сообщения: 2504
- Зарегистрирован: Вс апр 09, 2006 14:42
- Откуда: /home/Ukraine/Kyiv
-
Контактная информация:
#2
Сообщение
dobs » Вс янв 02, 2011 00:32
Вот рабочий вариант рекурсивного удаления каталогов
Взят из комментов на php.net
Код: Выделить всё
/**
* Delete a file or recursively delete a directory
*
* @param string $str Path to file or directory
*/
function recursiveDelete($str){
if(is_file($str)){
return @unlink($str);
}
elseif(is_dir($str)){
$scan = glob(rtrim($str,'/').'/*');
foreach($scan as $index=>$path){
recursiveDelete($path);
}
return @rmdir($str);
}
}
-
oleg000_som
- Сообщения: 3
- Зарегистрирован: Ср дек 29, 2010 17:37
- Откуда: Украина
-
Контактная информация:
#3
Сообщение
oleg000_som » Вс янв 02, 2011 01:52
Спасибо за решение, жаль что я в ООП не знаю... надо бы где-то как-то разобраться...
-
dobs
- HO Moderators
- Сообщения: 2504
- Зарегистрирован: Вс апр 09, 2006 14:42
- Откуда: /home/Ukraine/Kyiv
-
Контактная информация:
#4
Сообщение
dobs » Вс янв 02, 2011 17:14
Ну там не класс а простая функция... класс можно сделать примерно такой
Код: Выделить всё
class FileManager {
public function listdir($dir) {
// Выдаем листинг дир.
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
$files[] = $file;
}
closedir($dh);
}
return $files;
}
}
public function removeFile($str) {
// удалить файл или дир.
if(is_file($str)) {
return @unlink($str);
}
elseif(is_dir($str)) {
$scan = glob(rtrim($str,'/').'/*');
foreach($scan as $index=>$path){
recursiveDelete($path);
}
return @rmdir($str);
}
}
}
А юзать потом типа
Код: Выделить всё
$fm = new FileManager;
print_r($fm->listdir('/home/user...')); // Получить массив дир.
$fm->removeFile('/home/user...'); // удалить дир.
Подробней про ООП можно почитать тут
http://ua.php.net/oop
-
oleg000_som
- Сообщения: 3
- Зарегистрирован: Ср дек 29, 2010 17:37
- Откуда: Украина
-
Контактная информация:
#5
Сообщение
oleg000_som » Пн янв 03, 2011 19:15
Спасибо за советы, чел! Наверняка весь форум только на тебе и держится =) Сори за оффтоп. Тема исчерпана.
-
dobs
- HO Moderators
- Сообщения: 2504
- Зарегистрирован: Вс апр 09, 2006 14:42
- Откуда: /home/Ukraine/Kyiv
-
Контактная информация:
#6
Сообщение
dobs » Пн янв 03, 2011 23:52
Гг спс, но тут еще много народу, я просто самый флудливый из них