使用 php 删除所有文件、文件夹及其子文件夹 [重复]

Posted

技术标签:

【中文标题】使用 php 删除所有文件、文件夹及其子文件夹 [重复]【英文标题】:Remove all files, folders and their subfolders with php [duplicate] 【发布时间】:2012-07-21 18:23:12 【问题描述】:

我需要一个可以删除整个目录及其所有子文件夹、文件等的脚本。我尝试了几个月前在互联网上找到的这个功能,但它不能完全工作。

function deleteFile($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(!deleteFile($dir.$obj)) 
                        echo $dir.$obj."<br />";
                        return false;
                    
                
                elseif(is_file($dir.$obj))  
                    if(!unlink($dir.$obj)) 
                        echo $dir.$obj."<br />";
                        return false;
                    
                
            
        
        closedir($handle); 
        if(!@rmdir($dir)) 
            echo $dir.'<br />';
            return false;
        
        return true;
    
    return true;

对于测试,我使用了 prestashop 的解压缩存档,并尝试删除解压缩存档的文件夹,但它不起作用。

/home/***/public_html/prestashop/img/p/3/
/home/***/public_html/prestashop/img/p/3
/home/***/public_html/prestashop/img/p
/home/***/public_html/prestashop/img

这些是问题文件夹。第一次我想 - “可能是文件的 chmod 有问题”,但是当我测试所有文件 chmod 权限 755(之后是 777)时 - 结果是一样的。

【问题讨论】:

【参考方案1】:
<?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.net试试上面的代码

对我来说很好用

【讨论】:

哇,它运行得又快又完美!谢谢你,伙计! 这是一个非常好的例子。它确实会删除文件和子文件夹。 好答案唐纳德。我知道这对大多数人来说是显而易见的,但我认为它需要说:使用此功能(或此页面上的任何其他功能)时要非常小心。如果您给它错误的参数,它可以(并且将会)清除您的整个网站。 有没有办法检测成功删除文件夹?喜欢它返回 true 吗? 看看php.net/manual/en/function.rmdir.php rmdir() return bool ... 这样就可以用了【参考方案2】:
function delete_files($dir)  
  foreach(glob($dir . '/*') as $file)  
    if(is_dir($file)) delete_files($file); else unlink($file); 
   rmdir($dir); 

【讨论】:

添加一些文字,你至少应该说点什么,而不仅仅是转储代码。即使是“这应该可以解决问题:”也可以。 如果初始文件夹错误,glob() 将返回 false 并出现错误。最好测试 'if is_dir($dir)' 作为第一条指令,成功时可能返回 true,否则返回 false。无论如何,它会考虑每个条目。如果它是一个目录,它会被递归调用“delete_file”删除,否则它是一个文件,它会被 unlink() 删除。最后 $dir 为空,因此可以使用 'rmdir' 将其删除。【参考方案3】:

您可以使用更简洁的方法来递归删除目录。

例子:

function recursiveRemove($dir) 
    $structure = glob(rtrim($dir, "/").'/*');
    if (is_array($structure)) 
        foreach($structure as $file) 
            if (is_dir($file)) recursiveRemove($file);
            elseif (is_file($file)) unlink($file);
        
    
    rmdir($dir);

用法:

recursiveRemove("test/dir/");

【讨论】:

【参考方案4】:

使用system()方法的最简单最好的方法

$dir = dirname ( "/log" );
if ($handle = opendir($dir)) 
    while (( $file = readdir($handle)) !== false ) 
        if ($file != "." && $file != "..") 
            system("rm -rf ".escapeshellarg($dir.'/'.$file));
        
    

closedir($handle);

【讨论】:

如果您无法访问 shell(对于许多托管服务),我认为您不能使用“系统”方法。【参考方案5】:
/**
 * Deletes a directory and all files and folders under it
 * @return Null
 * @param $dir String Directory Path
 */
function rmdir_files($dir) 
 $dh = opendir($dir);
 if ($dh) 
  while($file = readdir($dh)) 
   if (!in_array($file, array('.', '..'))) 
    if (is_file($dir.$file)) 
     unlink($dir.$file);
    
    else if (is_dir($dir.$file)) 
     rmdir_files($dir.$file);
    
   
  
  rmdir($dir);
 

【讨论】:

它的功能相同,但有很多错误:) 不能说有很多错误,因为它对我有用,但它太危险了。

以上是关于使用 php 删除所有文件、文件夹及其子文件夹 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java FTPClient如何删除远程服务器端的文件夹及其子文件夹及其内容!

PHP 实现遍历出目录及其子文件

php复制目录下的所有文件及文件夹

java 访问文件夹及其子文件夹中的所有文件

Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件

gulp的路径问题,路径通配符 ** * ,拷贝所有文件夹及其子文件夹下的文件