Первый сайт на PHP

УДАЛЕНИЕ, ВЫПОЛНЕНИЕ ДЕЙСТВИЯ


Для удаления файлов в РНР существует специальная команда - unlink.

Примечание:

Команда unlink (имя файла с полным путем к нему) удаляет файл, указанный в ее параметре. Если этого сделать не удастся - выводит на страницу сообщение об ошибке.

Команда rmdir (имя директории с полным путем к ней) удаляет указанную в ее параметре директорию, если она пустая. Если удаляемая папка не пуста или сценарий не имеет прав на удаление директории, то на страницу выводится сообщение об ошибке.

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

И снова используем рекурсию. Вот как выглядит рекурсивный алгоритм удаления всего содержимого папки:

function delfiles($fId)

$hdl=opendir($fld); while ($file = readdir($hdl)) {

if (($file!=".")&&($file!="..")) {

if (is_dir($fld."/".$file)==True) {

delfiles ($fId.»/".$file); rmdir ($fld."/".$file); }

else {

unlink ($fld."/".$file); } } }



closedir($hdl);

}

Проанализируйте его сами. Думаю, вы легко поймете логику его работы: указанная в параметре функции папка сканируется сценарием, разобранным в главе "Папкопотрошилка", и если очередной найденный в ней объект является файлом, то он удаляется, а если объект представляет собой папку, то вызывается эта же функция, но в качестве параметра ей на сей раз передается имя этой папки. Рано или поздно функция дойдет до папок, содержащих одни файлы, и рекурсия начнет прерываться. После удаления всех файлов в папке удаляется и сама папка, так как она уже пустая.

Сам код выполнения удаления выбранных пользователем файлов прост.

Если в качестве действия выбрано удаление...

if ($udal!="")


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

foreach ($fl as $i)

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

if (is_dir($folder."/".$i)==True)

{

Если является, то удалим все файлы в этой директории - рекурсивной функцией delf iles...

delfiles ($folder."/".$i); а затем и саму, уже опустошенную директорию - командой rmdir.

rmdir ($folder."/".$i); } else

А если этот объект, подлежащий удалению, является обычным файлом...

то для него припасена уже упомянутая выше команда unlink: unlink ($folder."/".$i); }

И так поступим с каждым объектом, имя которого передано сценарию через массив $fl, а путь к нему - через переменную Sfolder в адресной строке.

} Собственно, и все (Рисунок 11.10).


Содержание раздела