PHP递归创建和删除文件夹的代码示例
本文提供了几种在PHP环境中使用递归方式批量创建和删除多级目录(包括其中所有子文件和文件夹)的代码片段。
目标:递归管理与删除目录
在处理如视频存储、日志归档等结构复杂的文件系统时,经常需要一次性创建多层级的空目录,或者清空并移除整个目录树。本文将展示几种不同的实现思路。
准备条件
- 环境要求:运行
PHP脚本的服务器或本地环境需对目标路径有读写权限。 - 路径规范:建议使用
/作为路径分隔符(兼容 Windows 和 Linux);测试时需确保传入的路径不存在严重的安全漏洞(如路径遍历)。
真实操作顺序
第1步:选择并应用【循环+递归】创建方案
目的:通过遍历字符串分割后的数组来实现逐级创建目录。该方法包含先判断层级再创建的逻辑,且附带了一个完整的递归删除示例。
入口:将代码保存为 PHP 文件并引入项目或本地运行。
动作:
- 建立目录:解析输入的路径字符串(例如
'video/2/3/4'),将其拆分为数组。 - 逐层构建:遍历数组,拼接当前路径。若该路径尚不存在(
!is_dir),则调用@mkdir($tmpPath, 0777)新建。 - 递归删除:对于非空目录,读取其下所有文件与子目录。如果是文件直接
unlink删除,如果是子目录则递归调用自身,直到子目录变空后使用rmdir清理。
参数与状态:执行成功后返回最终生成的完整路径,失败则返回 false。确保目标编码正确(如旧版 GB2312)以避免中文乱码导致的失败。
<?php
class UtilsMakeDir{
public static function makeDir($pathString){
$pathArray = explode('/',$pathString);
// 省略部分内部逻辑...
$tmpPath = array_shift($pathArray);
foreach ($pathArray as $val){
$tmpPath .= "/".$val;
if(is_dir($tmpPath)){
continue;
}
else {
@mkdir($tmpPath,0777);
}
}
return is_dir($tmpPath) ? $tmpPath : false;
}
public static function delDir($stringPath){
if(!$handle = @opendir($stringPath)){
return false;
}
while (false !==($file = readdir($handle))){
if($file !='.' && $file != '..'){
$tmpdir = $stringPath."/".$file;
if(is_dir($tmpdir)){
self::delDir($tmpdir);
rmdir($tmpdir);
}
if(is_file($tmpdir)){
unlink($tmpdir);
}
}
}
closedir($handle);
return true;
}
}
?>
第2步:使用【深度优先】的独立函数删除法
目的:提供一个更轻量级、不依赖类的函数库方案,专门用于安全地清空并销毁指定目录下的所有内容。
入口:deltree() 与辅助判断函数 is_empty_dir()。
动作:
- 判断状态:首先调用
is_empty_dir检查当前目录是否仅包含.和..两个特殊标识。 - 分支处理:
- 若为空,直接使用
rmdir($pathdir)删除当前目录。 - 若不为空,打开句柄遍历其中的内容。针对子目录进行递归
deltree()调用,针对普通文件使用unlink()剔除。
完成状态:当递归回溯到最顶层时,再次尝试使用 rmdir 删除该空目录本身。此方法在特定的Windows XP环境下经过验证,注意避免中文路径编码问题。
<?php
function is_empty_dir($pathdir){
$d=opendir($pathdir);
$i=0;
while($a=readdir($d)){$i++;}
closedir($d);
if($i>2){return false;}else return true;
}
function deltree($pathdir){
if(is_empty_dir($pathdir)){
rmdir($pathdir);
}else{
$d=dir($pathdir);
while($a=$d->read()){
if(is_file($pathdir.'/'.$a) && $a!='.' && $a!='..'){
unlink($pathdir.'/'.$a);
}elseif(is_dir($pathdir.'/'.$a) && $a!='.' && $a!='..'){
if(!is_empty_dir($pathdir.'/'.$a)){
deltree($pathdir.'/'.$a);
}else{
rmdir($pathdir.'/'.$a);
}
}
}
$d->close();
rmdir($pathdir);
}
}
?>
第3步:执行【带状态反馈】的深层删除流程
目的:实现一个能明确反馈执行成功与否,且在删除失败时具备一定容错的删除逻辑。
动作:
- 以
@rmdir($dir)==false && is_dir($dir)作为触发条件进入清理程序,表明常规删除遇到阻碍(通常是因为目录非空)。 - 使用
opendir获取目录指针,并通过readdir循环取出每一项。 - 识别项的类型:如果是目录,递归调用
deleteDir($file);如果是文件,直接unlink($file)。 - 清理完下层节点后,在外层再次尝试执行
rmdir并返回布尔值结果。
风险提示:此过程会不可逆地物理删除硬盘上的数据,使用前务必确认路径无误。建议在开发环境中测试成功后再应用于生产任务。
<?php
header("Content-Type:text/html; charset=utf-8");
function deleteDir($dir) {
if (@rmdir($dir)==false && is_dir($dir)) {
if ($dp = opendir($dir)) {
while (($file=readdir($dp)) != false) {
if($file!='.' && $file!='..') {
$file=$dir.'/'.$file;
if (is_dir($file)) {
deleteDir($file);
}else {
unlink($file);
}
}
}
closedir($dp);
}else{
return false;
}
}
if (is_dir($dir) && @rmdir($dir)==false)
return false;
return true;
}
if(deleteDir('./test_delete'))
echo "删除成功";
?>
完成判断与排错
- 权限检查:若
mkdir或rmdir均提示失败,请检查 Web 服务器进程用户(如www-data或nginx)对父目录是否有写入或删除权限。 - 字符编码:在较老的
PHP版本或特定操作系统上,若路径中包含中文,可能因编码不匹配导致找不到文件而执行报错。统一使用 UTF-8 编码编写代码和定义路径是最稳妥的做法。 - 递归死循环:在列出目录(如第三种方法的扩展阅读)时,务必屏蔽
.和..,否则会导致程序无限递归直至耗尽栈内存。
简要总结
以上介绍了通过不同逻辑实现的 PHP 递归创建与删除文件夹的具体方法与代码细节。这些工具函数可以帮助开发者高效地应对复杂的文件目录管理需求,更多关于文件系统的操作方法请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













