Я использую php для удаления папок, содержащих изображения сообщений, которые удаляются. Я использую приведенный ниже код, который я нашел в Интернете и делаю хорошую работу.
Я хочу знать, как я могу удалить только определенную папку в папке, когда в ней есть другие папки.
Когда я использую приведенный ниже код, как это можно сделать? Использование: / dev / images / norman / 8 -> Не удалять папку 8 Использование: / dev / images / norman / -> Удалит все папки
Eg: /dev/images/norman/8 -> I need to delete only this folder /dev/images/norman/9 /dev/images/norman/10 /dev/images/norman/11 /dev/images/norman/12 <?php $path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/8'; emptyDir($path); function emptyDir($path) { // INITIALIZE THE DEBUG STRING $debugStr = ''; $debugStr .= "Deleting Contents Of: $path<br /><br />"; // PARSE THE FOLDER if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { // IF IT"SA FILE THEN DELETE IT if(is_file($path."/".$file)) { if(unlink($path."/".$file)) { $debugStr .= "Deleted File: ".$file."<br />"; } } else { // IT IS A DIRECTORY // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS if($handle2 = opendir($path."/".$file)) { while (false !== ($file2 = readdir($handle2))) { if ($file2 != "." && $file2 != "..") { if(unlink($path."/".$file."/".$file2)) { $debugStr .= "Deleted File: $file/$file2<br />"; } } } } if(rmdir($path."/".$file)) { $debugStr .= "Directory: ".$file."<br />"; } } } } } echo $debugStr; } ?>
<?php delete_directory($dirname) { if (is_dir($dirname)) $dir_handle = opendir($dirname); if (!$dir_handle) return false; while($file = readdir($dir_handle)) { if ($file != "." && $file != "..") { if (!is_dir($dirname."/".$file)) unlink($dirname."/".$file); else delete_directory($dirname.'/'.$file); } } closedir($dir_handle); rmdir($dirname); return true; } ?>
-<?php delete_directory($dirname) { if (is_dir($dirname)) $dir_handle = opendir($dirname); if (!$dir_handle) return false; while($file = readdir($dir_handle)) { if ($file != "." && $file != "..") { if (!is_dir($dirname."/".$file)) unlink($dirname."/".$file); else delete_directory($dirname.'/'.$file); } } closedir($dir_handle); rmdir($dirname); return true; } ?>
если вы используете версию 5.1 и выше,
<?php function deleteDir($dir) { $iterator = new RecursiveDirectoryIterator($dir); foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) { if ($file->isDir()) { rmdir($file->getPathname()); } else { unlink($file->getPathname()); } } rmdir($dir); } deleteDir("temporary"); ?>
Вы хотите услышать о rmdir
.
if(is_file($path."/".$file)) { if(unlink($path."/".$file)) { $debugStr .= "Deleted File: ".$file."<br />"; } } else { if(rmdir($path."/".$file)) { $debugStr .= "Deleted Directory: ".$file."<br />"; } }
EDIT: поскольку rmdir
может обрабатывать только пустые директории, вы можете использовать это решение, как указано в комментариях к rmdir:
function rrmdir($dir) { foreach(glob($dir . '/*') as $file) { if(is_dir($file)) rrmdir($file); else unlink($file); } rmdir($dir); }
Он просто рекурсивно удаляет все в $dir
, а затем избавляется от самого каталога.
Я добавил параметр $exclude
для вашей функции, этот параметр – это массив с именами каталогов, которые вы хотите исключить из удаления, например:
$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/'; emptyDir($path); //will delete all under /norman/ emptyDir($path, array('8')); //will delete all under /norman/ except dir 8 emptyDir($path, array('8','10')); //will delete all under /norman/ except dir 8 and 10 function emptyDir($path,$exclude=false) { // INITIALIZE THE DEBUG STRING $debugStr = ''; $debugStr .= "Deleting Contents Of: $path<br /><br />"; if (!$exclude) { $exclude = array(); } // PARSE THE FOLDER if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { // IF IT"SA FILE THEN DELETE IT if(is_file($path."/".$file)) { if(unlink($path."/".$file)) { $debugStr .= "Deleted File: ".$file."<br />"; } } else if (!in_array($file, $exclude)) { // IT IS A DIRECTORY // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS if($handle2 = opendir($path."/".$file)) { while (false !== ($file2 = readdir($handle2))) { if ($file2 != "." && $file2 != "..") { if(unlink($path."/".$file."/".$file2)) { $debugStr .= "Deleted File: $file/$file2<br />"; } } } } if(rmdir($path."/".$file)) { $debugStr .= "Directory: ".$file."<br />"; } } } } } echo $debugStr; }
Вы можете использовать системные команды ex. exec("rm -rf {$dirPath}");
или если вы хотите сделать это с помощью PHP, вам нужно идти рекурсивно, петли не будут делать это правильно.
public function deleteDir($path) { if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { // IF IT"SA FILE THEN DELETE IT if(is_file($path."/".$file)) { if(unlink($path."/".$file)) { $debugStr .= "Deleted File: ".$file."<br />"; } } else { deleteDir($path."/".$file."/"); rmdir($path."/".$file); } } } } }
Когда я использую приведенный ниже код, как это можно сделать? Использование: / dev / images / norman / 8 -> Не удалять папку 8 Использование: / dev / images / norman / -> Удалит все папки
Я думаю, ваша проблема в том, что вам не хватает «/» в конце «/ dev / images / norman / 8»
$path='./ggg'; rrmdir($path); function rrmdir($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); } } reset($objects); rmdir($dir); } }