使用 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如何删除远程服务器端的文件夹及其子文件夹及其内容!