PHP递归删除函数

5
我编写了一个递归的PHP函数来删除文件夹。我想知道如何修改此函数以删除Web托管中除给定文件和文件夹名称(例如cgi-bin,.htaccess)之外的所有文件和文件夹?
顺便提一下,要使用此函数完全删除目录,请像这样调用。
recursive_remove_directory('path/to/directory/to/delete');

要使用此函数清空目录,请像这样调用:

recursive_remove_directory('path/to/full_directory',TRUE);

现在这个函数是:
function recursive_remove_directory($directory, $empty=FALSE)
{
    // if the path has a slash at the end we remove it here
    if(substr($directory,-1) == '/')
    {
        $directory = substr($directory,0,-1);
    }

    // if the path is not valid or is not a directory ...
    if(!file_exists($directory) || !is_dir($directory))
    {
        // ... we return false and exit the function
        return FALSE;

    // ... if the path is not readable
    }elseif(!is_readable($directory))
    {
        // ... we return false and exit the function
        return FALSE;

    // ... else if the path is readable
    }else{

        // we open the directory
        $handle = opendir($directory);

        // and scan through the items inside
        while (FALSE !== ($item = readdir($handle)))
        {
            // if the filepointer is not the current directory
            // or the parent directory
            if($item != '.' && $item != '..')
            {
                // we build the new path to delete
                $path = $directory.'/'.$item;

                // if the new path is a directory
                if(is_dir($path)) 
                {
                    // we call this function with the new path
                    recursive_remove_directory($path);

                // if the new path is a file
                }else{
                    // we remove the file
                    unlink($path);
                }
            }
        }
        // close the directory
        closedir($handle);

        // if the option to empty is not set to true
        if($empty == FALSE)
        {
            // try to delete the now empty directory
            if(!rmdir($directory))
            {
                // return false if not possible
                return FALSE;
            }
        }
        // return success
        return TRUE;
    }
}

请参见 http://trac.symfony-project.org/browser/branches/1.4/lib/util/sfToolkit.class.php#L54 获取现有的实现。 - user212218
3个回答

5
尝试像这样做:

尝试像这样做:

$it = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator('%yourBaseDir%'),
  RecursiveIteratorIterator::CHILD_FIRST
);

$excludeDirsNames = array();
$excludeFileNames = array('.htaccess');

foreach($it as $entry) {
  if ($entry->isDir()) {
    if (!in_array($entry->getBasename(), $excludeDirsNames)) {
      try {
        rmdir($entry->getPathname());
      }
      catch (Exception $ex) {
        // dir not empty
      }
    }
  }
  elseif (!in_array($entry->getFileName(), $excludeFileNames)) {
    unlink($entry->getPathname());
  }
}

我的基本目录是www文件夹,带有此函数的文件将位于www文件夹内。%yourBaseDir%是什么?它会执行整个递归文件夹删除吗?如何处理.htaccess文件? - heron
我的基础目录是www文件夹,包含此函数的文件将位于www文件夹内。那么%yourBaseDir%是什么?我的意思是该函数必须删除当前文件夹中的所有文件和文件夹,并排除数组和本身。 - heron
出现错误:在rmdir($entry->getPathname())的行上,目录不为空。 - heron
仍然存在问题:目录不为空。 - heron
然后对文件名进行一些路径检查。我发布的代码几乎就像魔法一样。请参考SplFileInfo - Yoshi
显示剩余6条评论

0
我正在使用该函数来删除带有所有文件和子文件夹的文件夹:
function removedir($dir) {
    if (substr($dir, strlen($dir) - 1, 1) != '/')
        $dir .= '/';
    if ($handle = opendir($dir)) {
        while ($obj = readdir($handle)) {
            if ($obj != '.' && $obj != '..') {
                if (is_dir($dir . $obj)) {
                    if (!removedir($dir . $obj))
                        return false;
                }
                else if (is_file($dir . $obj)) {
                    if (!unlink($dir . $obj))
                        return false;
                }
            }
        }
        closedir($handle);
        if (!@rmdir($dir))
            return false;
        return true;
    }
    return false;
}

$folder_to_delete = "folder"; // folder to be deleted

echo removedir($folder_to_delete) ? 'done' : 'not done';

我记得这是从php.net上获取的


0
  1. 你可以为 recursive_remove_directory() 提供一个额外的数组参数 $exclusions,但你必须在每次递归时传递这个参数。

  2. $exclusions 设为全局。这样它就可以在递归的每个级别中被访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接