Php удалить папку с файлами

Обновлено: 21.11.2024

С интерпретатором PHP поставляется множество полезных встроенных функций. Одной из таких функций является rmdir, которая позволяет нам удалить папку/каталог с помощью php-кода. Документацию по этой функции можно найти здесь.

Какой бы полезной ни была эта функция, она не может удалить каталог, если каталог не пуст, выдавая предупреждающее сообщение Каталог не пуст . В качестве обходного пути нам нужно сначала рекурсивно удалить все файлы и папки внутри указанного каталога, а затем удалить сам каталог.

Существуют различные способы получить все файлы и каталоги внутри указанного каталога. Для этой цели мы можем использовать opendir() вместе с readdir() или просто функцию glob().

Здесь мы рассмотрим альтернативный способ, в котором мы используем встроенную утилиту, поставляемую с SPL. SPL означает стандартную библиотеку PHP, которая поставляется с множеством утилит, таких как DataStructures, встроенные классы исключений, итераторы и другие.

Мы будем использовать два таких класса Iterator из SPL, RecursiveDirectoryIterator и RecursiveIteratorIterator .

Давайте сначала посмотрим на код.

Здесь removeDir — это функция, которая указывает путь к целевому каталогу.

Сначала мы создаем объект Traversable с помощью RecursiveDirectoryIterator, который принимает один обязательный параметр, путь к действительному каталогу и один необязательный параметр, flags . Здесь мы передали FilesystemIterator::SKIP_DOTS в качестве флага для пропуска файлов точек.

Основным компонентом этой функции является объект $files, который является экземпляром класса RecursiveIteratorIterator. Этот класс принимает один обязательный параметр, экземпляр Traversable, и два необязательных параметра, режим и флаги. Эти необязательные параметры используются для изменения поведения объекта по умолчанию. Здесь мы передаем RecursiveIteratorIterator::CHILD_FIRST в качестве режима, чтобы получить дочерние элементы каталога до получения самого имени каталога.

После получения объекта $files мы просто просматриваем каждый файл $file и удаляем его. Наконец, мы удаляем целевой каталог.

Удаляет имя файла . Подобно функции Unix C unlink(). В случае сбоя будет сгенерирована ошибка уровня E_WARNING.

Параметры

Путь к файлу.

Если файл является символической ссылкой, символическая ссылка будет удалена. В Windows для удаления символической ссылки на каталог необходимо использовать rmdir().

Возвращаемые значения

Возвращает true в случае успеха или false в случае неудачи.

Журнал изменений

Версия Описание
7.3.0 Вкл. Windows, теперь можно unlink() файлы с используемыми дескрипторами, хотя раньше это не удавалось. Однако по-прежнему невозможно воссоздать несвязанный файл, пока все его дескрипторы не будут закрыты.

Примеры

См. также

Пользовательские заметки 11 заметок

Это приведет к удалению всех файлов в каталоге, соответствующих шаблону в одной строке кода.

('unlink', glob("some/dir/*.txt" )); ?>

Удалили большой файл, но не видите увеличения свободного места или уменьшения использования диска? Используете UNIX или другую ОС POSIX?

Unlink() предназначена не для удаления файла, а для удаления имени файла. В справочной странице сказано: ``unlink - удалить имя и, возможно, файл, на который оно ссылается''.

Большую часть времени файл имеет только одно имя — его удаление также удалит (освободит, освободит) «тело» файла (с одной оговоркой, см. ниже). Это простой, обычный случай.

Однако файл может иметь несколько имен (см. функцию link()) в одном или разных каталогах. Все имена будут ссылаться на тело файла и, так сказать, "поддерживать его жизнь". Только после удаления всех имен тело файла фактически освобождается.

Предупреждение:
Тело файла может *также* быть `поддержано живым' (все еще использующим дисковое пространство) процессом, удерживающим файл открытым. Тело не будет освобождено (не освободит место на диске), пока процесс держит его открытым. На самом деле, есть причудливый способ воскресить файл, удаленный по ошибке, но все еще открытый процессом.

отключить($fileName); у меня не получилось.
Затем я попытался использовать функцию realpath($fileName) как
unlink(realpath($fileName)); это сработало

просто опубликую на случай, если кому-то это покажется полезным.

Вот самый простой способ удалить файлы с маской

= "*.jpg"
array_map ("unlink", glob ($mask));
?>

Я работал над небольшой пробной версией, в которой перед изменением основного текстового файла был создан файл резервной копии. Затем при возникновении ошибки основной файл будет удален (отключен), а вместо него будет возвращен файл резервной копии.

Тем не менее, я уже около часа ломаю голову над тем, почему я не могу получить права на удаление связи с основным файлом.

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

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

// Сначала закрываем файл
fclose ( $fp );

// Затем отвязать :)
отключить ( $somefile );
?>

Чтобы удалить все файлы с определенным расширением или фактически удалить все с подстановочным знаком, гораздо проще использовать функцию glob. Скажем, я хотел удалить все jpg .

foreach ( glob ("*.jpg" ) as $filename ) echo " Размер $filename " . размер файла ($имя_файла). "\п" ;
отключить ( $filename );
>

Это может показаться очевидным, но я рвал на себе волосы из-за этой проблемы — убедитесь, что файл, который вы пытаетесь удалить, в настоящее время не используется. У меня был скрипт, который анализировал текстовый файл и должен был удалить его после завершения, но продолжал получать ошибку отказа в разрешении, потому что я явно не закрыл файл, следовательно, технически он все еще «использовался», хотя анализ был завершено.

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

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

= getcwd(); // Сохраняем текущий каталог
chdir ( $path_to_file );
отключить ( $filename );
chdir ( $old ); // Восстановить старый рабочий каталог
?>

В OSX при борьбе с ошибкой «Отказано в доступе» убедитесь, что у каталога есть разрешения на запись для исполняющего пользователя php.

Кроме того, если вы полагаетесь на списки управления доступом и хотите удалить файл или символическую ссылку, у содержащего каталога должно быть разрешение «delete_child», чтобы отменить связь между вещами внутри. Если вы предоставите «удалить» только папке, это позволит вам удалить саму папку-контейнер, но не объекты внутри.

unlink работает так же, как команда rm в nix на основе потерь или команда del в Windows, она не разрешает файл, а удаляет точный указанный путь, даже если этот путь является просто ссылкой.

EG
/var/www/test/index.php = symlink(/home/test/www/index.php)
( "/var/www/test/index.php" ) ;
?>
Будет удалена только ссылка, а не исходный файл, где как
( "/home/test/www/index.php" );
?>
Отключит исходный путь к файлу и разорвет символическую ссылку, а также позволит перезаписать систему, поскольку файловая система больше не будет знать о местоположении файла.

Лучший способ удалить файлы по маске:
( glob ( '/etc/*' ), 'unlink' );
?>
Не используйте array_map, упомянутый ниже, - его цель - обработать значения в заданном массиве И СОБИРАТЬ данные, возвращаемые функцией обратного вызова. Таким образом, array_map работает медленнее и использует дополнительную память по сравнению с array_walk.

Добро пожаловать в учебник по удалению файлов в PHP. Нужно удалить некоторые старые, резервные или временные файлы в PHP?

  • Чтобы удалить файл в PHP, используйте unlink("TARGET FILE");
  • Чтобы удалить пустую папку, используйте rmdir("FOLDER");

Это охватывает супербыстрые основы, но «расширенное удаление» целых папок и только определенных типов файлов — это совсем другая история. Как мы это делаем? Читайте дальше, чтобы увидеть больше примеров!

ⓘ Я включил zip-файл со всем исходным кодом примера в начале этого руководства, поэтому вам не нужно копировать и вставлять все… Или если вы просто хотите сразу погрузиться.

БЫСТРЫЕ СЛАЙДЫ

СОДЕРЖАНИЕ

СКАЧАТЬ И ПРИМЕЧАНИЯ

Во-первых, вот ссылка для загрузки примера кода, как и было обещано.

БЫСТРЫЕ ЗАМЕЧАНИЯ

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

СКАЧАТЬ ПРИМЕР КОДА

Нажмите здесь, чтобы загрузить исходный код. Я выпустил его под лицензией MIT, так что не стесняйтесь строить на его основе или использовать в своем собственном проекте.

СПОСОБЫ УДАЛИТЬ ФАЙЛЫ В PHP

Хорошо, теперь давайте перейдем к примерам удаления файлов в PHP.

1) ПРОСТОЕ УДАЛЕНИЕ

Как и во введении выше, мы используем unlink() для удаления файлов и rmdir() для удаления каталогов. Обратите внимание, что обе функции на самом деле возвращают значение true/false, чтобы указать, успешно ли прошел процесс; Файлы, защищенные от копирования, не могут быть удалены, а папки, которые не являются пустыми, не могут быть удалены.

2) УДАЛИТЬ, ЕСЛИ ФАЙЛ СУЩЕСТВУЕТ

PHP выдает надоедливые предупреждения при удалении несуществующих файлов. Итак, вот «быстрое решение» — просто выполните проверку file_exists(), прежде чем приступить к удалению.

3) УДАЛИТЬ ТОЛЬКО ОПРЕДЕЛЕННЫЕ ТИПЫ ФАЙЛОВ

Хотите удалить только определенные типы файлов в папке? Используйте функцию glob(), чтобы отфильтровать список выбранных файлов, а затем удалите их один за другим.

4) УДАЛИТЬ ФАЙЛЫ, ТОЛЬКО ЕСЛИ СТАРШЕ УСТАНОВЛЕННОЙ ДАТЫ

Хотите удалить некоторые старые резервные копии или устаревшие файлы? Это почти та же история с использованием старого доброго glob() для получения списка файлов в папке. Затем используйте filemtime() для проверки времени «последнего изменения файла». Удалите файл, если он старше установленной даты.

5) УДАЛИТЬ ПАПКУ ВСЮ

Одна из самых запутанных, так как мы не можем просто использовать rmdir(), чтобы удалить всю папку напрямую. Не буду объяснять это построчно, но, по сути, delFolder() — это рекурсивная функция, которая копается в заданной папке и удаляет все, что внутри.

6) УДАЛЕНИЕ КОМАНДНОЙ СТРОКИ

Наконец, это не совсем «удаление в PHP»… Но мы действительно можем запускать команды оболочки в PHP для удаления файлов и папок.

ПОЛЕЗНЫЕ ИНФОРМАЦИИ И ССЫЛКИ

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

РЕЗЮМЕ

БОЛЬШЕ ССЫЛОК

ИНФОГРАФИЧЕСКАЯ Шпаргалка

КОНЕЦ

Спасибо, что прочитали, и мы подошли к концу этого руководства. Я надеюсь, что это помогло вам с вашим проектом, и если вы хотите поделиться чем-либо с этим руководством, пожалуйста, не стесняйтесь комментировать ниже. Удачи и удачного кодирования!

Оставить комментарий Отменить ответ

Поиск

Прорыв в Javascript

Сфотографировать с помощью веб-камеры? Голосовые команды? Видеозвонки? Да, это возможно с помощью Javascript — ознакомьтесь с прорывом Javascript!

В этой статье мы покажем, как удалить файл с помощью PHP.

Удаление файлов может потребоваться по многим причинам.

Удаление файла означает, что вы полностью стираете его из каталога, так что файл больше не существует.

Так как же это делается с помощью PHP?

В PHP есть функция unlink(), которая позволяет нам удалить файл.

Итак, PHP-код для удаления файла показан ниже.

Итак, приведенный выше код очень прост. Это одна строка.

Функция PHP delete() принимает один параметр.

Параметр — это файл, который мы хотим удалить. В этом параметре мы должны указать имя файла вместе с его расширением. Не оставляйте расширение файла, иначе функция не будет работать.

Итак, это все, что требуется для удаления файла.

Несмотря на то, что приведенный выше код очень эффективен и выполняет работу по удалению файла, часто нам хотелось бы добавить к нему что-то еще, чтобы получить больше информации. Например, существует ли файл, который мы хотим удалить? Если файл существует, был ли он успешно удален?

Приведенный ниже PHP-код удаляет файл и предоставляет нам дополнительную информацию.

Этот код теперь более прямолинеен. Это говорит нам больше.

Сначала мы смотрим, существует ли файл. Если файл существует, код переходит к следующей строке. В этой строке мы создаем переменную с именем $deleted. Эта переменная содержит результат функции разъединения PHP. Если файл был успешно удален, переменная $deleted будет содержать значение 1 или TRUE. Если это не так, переменная $deleted будет содержать значение 0 или FALSE. Если файл успешно удален, выводится строка «Файл успешно удален». Если нет, выводится строка "Файл не был успешно удален".

Если файл не существует, выводится строка "Исходный файл, который вы хотите удалить, не существует".

Итак, приведенный выше код говорит нам обо всем. Он сообщает нам, существует ли файл, который мы хотим удалить. И он сообщает нам, было ли удаление файла успешным или нет.

И это все, что требуется для удаления файла с помощью PHP.

Как удалить все файлы в каталоге с определенным критерием или критериями

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

Скажем, у вас есть список файлов, в которых есть слово "HTML4", например "Как создать горизонтальную линию с помощью HTML4", "Как создать абзац". -using-HTML4" и "How-to-create-an-anchor-tag-using-HTML4", и вы обновили себя до всего HTML5 и решили, что хотите удалить все файлы с HTML4.

Представьте, что у вас есть 70 таких файлов. Представьте, если бы у вас были сотни. Вам придется просмотреть каждый из этих файлов и удалить их вручную.

В этом прелесть PHP-функции unlink().

С помощью одного блока кода мы можем удалить все эти файлы менее чем за минуту, вместо того, чтобы вручную делать это часами или днями.

Так как же пройтись по всем файлам в каталоге и удалить нужные файлы?

Итак, этот код выполняет поиск в каталоге статей. Конечно, вы можете указать любой каталог на своем веб-сайте.

Код PHP проверяет, является ли это каталогом. Если это так, он открывает каталог. Цикл while перебирает все файлы в каталоге.

Затем мы пишем оператор if, чтобы узнать, содержит ли каждый файл фразу "HTML4". Если это так, мы удаляем файл с помощью функции PHP unlink().

Читайте также: