2012-03-18 35 views
-1

可能重复:
How do I recursively delete a directory and its entire contents (files+sub dirs) in PHP?在PHP中,我如何递归删除所有非空的文件夹?

我需要递归删除目录,以及不为空的子目录。我找不到任何有用的类或函数来解决这个问题。

提前感谢您的回答。

+0

使用搜索功能(就像我刚才那样)会得到你的答案:http://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its -entire-contents-filessub-dirs – 2012-03-18 17:34:13

+0

http://lixlpixel.org/recursive_function/php/recursive_directory_delete/ – rjz 2012-03-18 17:34:21

回答

19

从官方文档中的第一条评论。

http://php.net/manual/en/function.rmdir.php

<?php 

// When the directory is not empty: 
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); 
    } 
} 

?> 

编辑rmdir来rrmdir以纠正意图明显错字创建递归函数。

+2

该死的,愚蠢的,因为某些原因想要人为验证,当我试图发布我的答案! +1虽然:-)。 – 2012-03-18 17:36:36

+1

存在导致深层目录不起作用的错字。 if(filetype($ dir。“/”。$ object)==“dir”)rmdir($ dir。“/”。$ object);应该是rrmdir,以便再次调用该函数...否则,太棒了! – amurrell 2014-06-17 20:15:58

0

要递归删除目录,使用这样的:

function rrmdir($path) { 
    return is_file($path)? @unlink($path): array_map(__NAMESPACE__ . '\rrmdir',glob($path.'/*'))[email protected]($path); 
} 

仅在UNIX测试。

1

像这样的东西应该做...

function removeDir($path) { 

    // Normalise $path. 
    $path = rtrim($path, '/') . '/'; 

    // Remove all child files and directories. 
    $items = glob($path . '*'); 

    foreach($items as $item) { 
     is_dir($item) ? removeDir($item) : unlink($item); 
    } 

    // Remove directory. 
    rmdir($path); 
} 

removeDir('/path/to/dir'); 

这将删除所有子文件和文件夹,然后删除传递给它的顶层文件夹。

它可以做一些错误检查,如测试提供的路径是一个目录,并确保每次删除成功。

+0

如果有文件的子文件夹,这个功能不工作..删除你的帖子,请不要浪费用户时间.. – 2014-11-26 09:12:34

+1

@tazotodua而不是写一个构造不好的句子说明*不起作用*,为什么不'你解释为什么它不起作用,所以我可以修复它? – alex 2014-11-26 23:27:34

相关问题