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

  第一种方法:

  

复制代码 代码如下:

  <?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(".");

  ?>