PHP递归删除非空目录的函数示例

1 下载量 159 浏览量 更新于2024-08-30 收藏 48KB PDF 举报
"PHP递归删除目录的代码实例和方法" 在PHP编程中,删除目录是一项常见的任务,尤其是处理用户上传的文件或清理临时文件时。当需要删除的目录不为空时,单纯使用`rmdir()`函数是无法完成的,因为它只能删除空目录。为了删除包含文件和子目录的整个目录结构,我们需要采用递归方法。以下是两个PHP递归删除目录的实例,它们可以帮助我们理解并实现这一功能。 实例一: 这个实例中定义了一个名为`deletedir()`的函数,它首先检查要打开的目录是否存在。然后,通过`readdir()`遍历目录中的每个文件或子目录。如果遇到的不是当前目录(".")和父目录(".."),它会进一步处理。对于子目录,再次调用`deletedir()`函数进行递归删除;对于文件,使用`unlink()`函数尝试删除。最后,当所有文件和子目录都被删除后,尝试使用`rmdir()`删除原始目录。 ```php function deletedir($dir) { if (!($handle = opendir($dir))) { die("没有该目录"); } while (false !== ($file = readdir($handle))) { if ($file !== "." && $file !== "..") { $file = $dir . DIRECTORY_SEPARATOR . $file; if (is_dir($file)) { deletedir($file); } else { if (@unlink($file)) { echo "文件$file删除成功。<br>"; } else { echo "文件$file删除失败!<br>"; } } } } if (@rmdir($dir)) { echo "目录$dir删除成功了。<br>\n"; } else { echo "目录$dir删除失败!<br>\n"; } } ``` 实例二:兼容中文目录和文件的递归删除方法 这个实例考虑到了可能存在的中文目录和文件名,使用`mb_detect_encoding()`检测目录的编码,并通过`iconv()`进行转换,确保在不同编码环境下能正常工作。函数`delete_dir()`执行的逻辑与第一个实例类似,只是增加了对编码的处理。 ```php function delete_dir($tmp_path) { if (!is_writable($tmp_path) && is_dir($tmp_path)) { chmod($tmp_path, 0777); } $encode = mb_detect_encoding($tmp_path, array('UTF-8', 'GB2312', 'ASCII', 'GBK')); $tmp_path = iconv($encode, 'gb2312', $tmp_path); // ...其他代码(类似于实例一的逻辑)... } ``` 这两个实例展示了如何在PHP中编写递归函数来删除非空目录及其所有内容,包括子目录和文件。在实际应用中,应当注意处理可能出现的错误,如权限问题、文件锁等,以确保程序的健壮性。同时,谨慎操作此类功能,因为它们具有破坏性,一旦运行,可能无法恢复删除的数据。在删除前,最好先备份重要数据,以防万一。