php递归创建和删除文件夹的代码小结


Posted in PHP onApril 13, 2012

第一种方法:

<?php 
/** 
* 目录生成类 :UtilsMakeDir 
* @author yepeng 
* @since 2010.3.18 
*/ 
class UtilsMakeDir{ 
//基目录 建立目录时不会对这个目录进行建立。这应该是个已经存在的目录 
private static $makeBasePath = 'video'; 
private static $delBasePath = 'video'; /** 
* 递归建立目录, 
* 建立成功返回这个全路径, 
* 建立失败返回false 
* @param String $pathString 路径字符串如'2/3/4/5' 
* @return false or string 
public static function makeDir($pathString){ 
$pathArray = explode('/',$pathString); 
if(empty($pathArray[0])){ 
return false; 
} 
$path = array_shift($pathArray); 
self::$basePath = self::$basePath.'/'.$path; 
if(is_dir(self::$basePath)){ 
$path = implode('/',$pathArray); 
self::makeDir($path); 
} 
else{ 
@mkdir(self::$basePath,0777); 
$path = implode('/',$pathArray); 
self::makeDir($path); 
} 
if(is_dir(self::$basePath)){ 
return self::$basePath; 
} 
else{ 
return false; 
} 
} */ 
/** 
* 建立目录,包括基目录,比如图片要放在video(video为存在的目录)下面,你传入的参数应该是video/2/3/4 
* 建立成功返回这个全路径, 
* 建立失败返回false 
* @param String $pathString 路径字符串如'video/2/3/4/5' 
* @return false or string 
**/ 
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); 
} 
} 
if(is_dir($tmpPath)){ 
return $tmpPath; 
} 
else{ 
return false; 
} 
} /** 
* 递归删除 
* 删除目录及文件 
* 如果传一个‘video/2/3/4'这样的路径将删除4下的所有目录和文件 
* @param string $stringPath 
*/ 
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); 
}} 
?>

循环+递归,在winxp下测试成功,只要php文件编码为gb2312,文件名随意,应该把文件名改为编码为gb2312,就行
<?php 
deltree('./复件 复件 复件 复件 复件 复件 复件 复件 aaa'); 
function deltree($pathdir) 
{ 
//echo $pathdir.'<br/>';//我调试时用的 
if(is_empty_dir($pathdir))//如果是空的 
{ 
rmdir($pathdir);//直接删除 
} 
else 
{//否则读这个目录,除了.和..外 
$d=dir($pathdir); 
while($a=$d->read()) //下只删除$pathdir下 
{ 
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(); 
//echo "必须先删除目录下的所有文件";//我调试时用的 
rmdir($pathdir); 
} 
} 
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; 
} 
?>

第二种递归法 在winxp下测试成功,只要php文件编码为gb2312,文件名随意,应该把文件名改为编码为gb2312,就行,没测
<?php 
header("Content-Type:text/html; charset=gb2312"); 
if(deleteDir('./复件 复件 复件 复件 复件 复件 复件 复件 复件 复件 复件 aaa')) 
echo "删除成功"; 
function deleteDir($dir) 
{ 
if (@rmdir($dir)==false && is_dir($dir)) //删除不了,进入删除所有文件 
{ 
if ($dp = opendir($dir)) 
{ 
while (($file=readdir($dp)) != false) 
{ 
if($file!='.' && $file!='..') 
{ //echo $file=$dir.'/'.$file;echo '<br/>'; 
$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; 
} 
?>

第三种递归法 在winxp下测试成功,是列出目录文件 很好用
<?php 
function listDir($dir) 
{ 
static $break=0; if($break++==100) exit;//控制深入层数 
static $i=-0; 
if(is_dir($dir))//目录 
{ 
if ($dh = opendir($dir))//打开 
{ 
while (($file = readdir($dh)) !== false) 
{ 
if((is_dir($dir."/".$file)) && $file!="." && $file!="..")//目录 
{ 
$j=$i;while($j--) echo "-------"; 
echo "<b><font color='red'>目录名:</font></b>".$dir."/".$file."<br><hr>"; 
$i++; 
listDir($dir."/".$file); 
$i--; 
} 
else 
{ 
if($file!="." && $file!="..") 
{ 
$j=$i;while($j--) echo "-------"; 
$ext=trim(extend($file)); 
//if($ext=='jpg') 
echo $dir.'/'.$file."<br>"; 
} 
} 
} 
closedir($dh); 
} 
} 
} 
function extend($file_name) 
{ 
$retval=""; 
$pt=strrpos($file_name, "."); 
if ($pt) $retval=substr($file_name, $pt+1, strlen($file_name) - $pt); 
return ($retval); 
} 
//开始运行 
listDir("."); 
?>
PHP 相关文章推荐
PHP 错误之引号中使用变量
May 04 PHP
PHP 字符串 小常识
Jun 05 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
php密码生成类实例
Sep 24 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
怎样搭建PHP开发环境
Jul 28 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 PHP
PHP内存溢出优化代码详解
Feb 26 PHP
redis 队列操作的例子(php)
Apr 12 #PHP
PHP得到某段时间区间的时间戳 php定时任务
Apr 12 #PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 #PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 #PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 #PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 #PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 #PHP
You might like
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
详解K-means算法在Python中的实现
2017/12/05 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
python爬虫要用到的库总结
2020/07/28 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
Java程序员面试题
2016/09/27 面试题
中国央视网签名寄语
2014/01/18 职场文书
区级文明单位申报材料
2014/05/15 职场文书
保姆聘用合同
2015/09/21 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
导游词之无锡梅园
2019/11/28 职场文书
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js