PHP递归删除函数

PHP递归删除函数,php,recursion,delete-file,dir,unlink,Php,Recursion,Delete File,Dir,Unlink,我编写了用于删除文件夹的递归PHP函数。我想知道,如何修改此函数以删除webhosting中的所有文件和文件夹,不包括给定的文件和文件夹名称数组(例如.cgi-bin、.htaccess) 顺便说一句 使用此函数完全删除这样的目录调用 recursive_remove_directory('path/to/directory/to/delete'); 要使用此函数清空目录调用,请执行以下操作: recursive_remove_directory('path/to/full_directory

我编写了用于删除文件夹的递归PHP函数。我想知道,如何修改此函数以删除webhosting中的所有文件和文件夹,不包括给定的文件和文件夹名称数组(例如.cgi-bin、.htaccess)

顺便说一句

使用此函数完全删除这样的目录调用

recursive_remove_directory('path/to/directory/to/delete');
要使用此函数清空目录调用,请执行以下操作:

recursive_remove_directory('path/to/full_directory',TRUE);
$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());
  }
}
现在函数是

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;
    }
}
  • 您可以向
    递归删除目录()
    提供一个额外的数组参数
    $exclusions
    ,但每次都必须递归地传递此参数

  • $Exclutions
    设置为全局。通过这种方式,可以在递归的每一个级别访问它


  • 试着这样做:

    recursive_remove_directory('path/to/full_directory',TRUE);
    
    $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());
      }
    }
    

    我正在使用此功能删除包含所有文件和子文件夹的文件夹:

    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';
    

    Iirc我是从php.net中得到这个的

    我的基本目录是www文件夹,带有这个函数的文件将在www文件夹中。什么是
    %yourBaseDir%
    ?它也会做整个递归文件夹删除??以及如何处理.htaccess?我的基本目录是www文件夹,具有此功能的文件将位于www文件夹内。什么是%yourBaseDir%?我的意思是,该函数必须删除当前文件夹中的所有文件和文件夹,并排除数组,以及它自己的错误:`Directory not empty on line rmdir($entry->getPathname());'仍然存在问题:目录不为空有人给了我一个想法:if(substr($oneExcludedFileOrDirectory,0,strlen($currentDir)==$currentDir){echo“Directory not empty”;}但我不知道现有实现应该在哪里看到它。