2011-09-02 82 views
2

可能重复:
how to delete a folder with contents using PHPPHP删除目录不为空

我知道,你可以删除一个文件夹是空的,命令rmdir。我知道你可以用下面三行清除一个文件夹。

foreach($directory_path as $file) { 
     unlink($file); 
} 

但是,如果一个文件实际上是一个子目录什么。一个人如何摆脱这个问题,但却无限量地享受着双镜效应。在PHP中有没有强制删除目录?

感谢

回答

32

此功能将删除一个目录 - [R ecursively:

function rmdir_recursive($dir) { 
    foreach(scandir($dir) as $file) { 
     if ('.' === $file || '..' === $file) continue; 
     if (is_dir("$dir/$file")) rmdir_recursive("$dir/$file"); 
     else unlink("$dir/$file"); 
    } 
    rmdir($dir); 
} 

这一个太:

function rmdir_recursive($dir) { 
    $it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); 
    $it = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); 
    foreach($it as $file) { 
     if ($file->isDir()) rmdir($file->getPathname()); 
     else unlink($file->getPathname()); 
    } 
    rmdir($dir); 
} 
+2

其实你可以使用RecursiveDirectoryIterator :: SKIP_DOTS标志来避免第一个if语句... – Moby04

+0

SKIP_DOTS在文档中不存在,你在哪找到这个? – Eric

+2

SKIP_DOTS在此处引用:[FilesystemIterator文档](http://php.net/manual/fr/filesystemiterator.construct.php)。它来自父类'FilesystemIterator'。 – Elorfin

7

从PHP rmdir页:

<?php 
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); 
    } 
} 
?> 

而且

<?php 
function delTree($dir) { 
    $files = glob($dir . '*', GLOB_MARK); 
    foreach($files as $file){ 
     if(substr($file, -1) == '/') 
      delTree($file); 
     else 
      unlink($file); 
    } 

    if (is_dir($dir)) rmdir($dir); 

} 
?> 
+0

感谢这么多,第一功能完美的作品! – Jjack

2
<?php 
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); 
    } 
} 
?> 

从PHP的文档