首页 > 编程技术 > php

PHP递归删除文件与目录函数

发布时间:2016-11-25 15:44

在php中删除文件与目录rmdir()函数就可以搞定,但是要删除一个非空目录,将不能进行快速的删除,必须先将目录中文件删除,但是目录里可能还会有子目录所以要进行PHP递归删除目录


递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行。

我们来看一个经典的递归删除函数

函数的作用:删除目录下面的所有文件,并删除目录

函数代码:

 代码如下 复制代码

<?php 
function deldir($dirname){ 
    if(file_exists($dirname)){//首先判断目录是否有效 
        $dir = opendir($dirname);//用opendir打开目录 
        while($filename = readdir($dir)){//使用readdir循环读取目录里的内容 
         if($filename != "." && $filename != ".."){//排除"."和".."这两个特殊的目录 
            $file = $dirname."/".$filename; 
            if(is_dir($file)){//判断是否是目录,如果是则调用自身 
                deldir($file); //使用递归删除子目录   
            }else{ 
              @unlink($file);//删除文件 
            } 
          } 
        } 
            closedir($dir);//关闭文件操作句柄 
            rmdir($dirname);//删除目录 
    } 

?>

使用实例:Public是一个文件夹,里面有许多文件夹和文件,调用deldir($dirname)把它删除

<?php 
$dir='Public';//传入一个文件夹路径 
deldir($dir);//调用函数 
?>

说明:首先判断Public是否存在,如果在则打开Public,然后使用readdir循环读取Public目录里的内容,如果存在"."和".."这两个特殊目录则排除掉。如果遇到文件夹则调用自身处理,直到条件不满足。遇到文件则直接删除掉。最后层层跳出删除Public。


实例二,删除非空目录

 代码如下 复制代码

/*
 自定义的删除函数,可以删除文件和递归删除文件夹
*/
 function my_del($path)
{
 if(is_dir($path))
 {
   $file_list= scandir($path);
   foreach ($file_list as $file)
   {
    if( $file!='.' && $file!='..')
    {
     my_del($path.'/'.$file);
    }
   }
   @rmdir($path);  //这种方法不用判断文件夹是否为空, 因为不管开始时文件夹是否为空,到达这里的时候,都是空的  
 }
 else
 {
  @unlink($path);    //这两个地方最好还是要用@屏蔽一下warning错误,看着闹心
 }

}


$path='d:/技术文档 - 副本';    //要删除的文件夹

//如果php文件不是ANSI,而是UTF-8模式,而且要删除的文件夹中包含汉字字符的话,调用函数前需要转码
//$path=iconv( 'utf-8', 'gb2312',$path );

my_del($path); 

例3,可查看成功之失败原因

 代码如下 复制代码
<?php   
functiondeletedir($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"文件<b>$file</b>删除成功。<br>";   
}else{   
echo"文件<b>$file</b>删除失败!<br>";   
}   
}   
}   
if(@rmdir($dir)){   
echo"目录<b>$dir</b>删除成功了。<br>n";   
}else{   
echo"目录<b>$dir</b>删除失败!<br>n";   
}   
}   
 
//测试程序   
$dir="/var/www/test";   
deletedir($dir);   
?>  

 
在/var/www/test文件夹下建一写文件夹和文件测试   
shell>touchaaa   
shell>touchbbb   
shell>touchccc   
shell>toucheee   
shell>touchffff   
shell>mkdir111   
shell>mkdir222   
shell>mkdir333   
分别再在111,222,333文件夹下建写文件这里就不多说了,然后给他们权限   
shell>chown[url]www.www[/url]test-R

在php中替换字符串我们都会使用到str_replace函数了,此函数还可以使用正则,下面小编来给大家介绍一下替换字符串中的一些字符或替换第一次出现的字符实例。

现在有个需求:字符串A与字符串B,字符串B中包含字符串A,利用字符串A将字符串B中的A替换成其他字符串或删除。

利用PHP函数,str_ireplace() 与 str_replace() 可以做到。

一、str_ireplace(find,replace,string,count) 函数使用一个字符串替换字符串中的另一些字符(该函数对大小写不敏感)。

例如:

 代码如下 复制代码

<?php
     header(“Content-Type: text/html; charset=utf-8"); // 防止中文乱码
    $str_1 = '郭g碗w瓢p盆p';
    $str_2 = '?潘?';
    $str_3 = 'PHP 替换字符串中的一些字符串-郭G碗w瓢p盆P';
                             
    $str = str_ireplace($str_1,$str_2,$str_3);
    echo $str;
    // 输出:PHP 替换字符串中的一些字符串-?潘
?>

 二、str_replace(find,replace,string,count) 函数使用一个字符串替换字符串中的另一些字符(该函数对大小写敏感)。


(参数与描述同 str_ireplace() 函数)

 代码如下 复制代码

<?php
    header(“Content-Type: text/html; charset=utf-8"); // 防止中文乱码
    $str_1_s = '郭g碗w瓢p盆p';
    $str_1_b = '郭G碗w瓢p盆P';
    $str_2 = '?潘?';
    $str_3 = 'PHP 替换字符串中的一些字符串-郭G碗w瓢p盆P';
             
    $str_s = str_replace($str_1_s,$str_2,$str_3).'<br /><br />';
    $str_b = str_replace($str_1_b,$str_2,$str_3);
    echo $str_s; // 无法查找到,输出原字符串
    echo $str_b; // 被正确替换
    // $str_s 输出:PHP 替换字符串中的一些字符串-郭G碗w瓢p盆P
    // $str_b 输出:PHP 替换字符串中的一些字符串-?潘
?>

上面要替换肯定全部替换了,我如果想只替换第一次出现的字符呢

很多人想到了用str_replace()函数,看看这个函数的使用是不是我们要的
str_replace( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

不小心还真以为是我们想要的呢,最后那个参数是返回替换发生的总次数,它是一个引用变量,而不是我要想要的指定它将替换几次,所以用str_replace()是不行的

preg_replace()是可以实现的,可惜用了正则,

 代码如下 复制代码

$str=preg_replace('/abc/','xyz',$str,1);
echo $str;

有没有不用正则的,嗯可以这样

 代码如下 复制代码

$replace='xyz';
if(($position=strpos($str,$replace))!==false){
     $leng=strlen($replace);
    $str=substr_replace($str,'xyz',$position,$leng);
}
echo $str;

在一个层面来看php中的explode与split函数没什么区别都用来把字符以什么分开成数组了,但仔细看一下explode与split还是有区别的,下面我来给大家介绍一下。

首先来看下两个方法的定义:

函数原型:array split (string $pattern, string $string [, int $limit])

函数原型:array explode ( string $separator, string $string [, int $limit])

初看没有啥差别,貌似功能都一样。我就犯了这个错误。 请注意两个函数的第一个参数string $pattern和string separator,一个是$pattern说明是正则字符串,一个是$separator是普通字符串。 看下面的代码:

 代码如下 复制代码

$test = end(explode('.', 'abc.txt'));

echo $test;//output txt

换成:

$test1 = end(split('.','abc.txt'));

echo $test1;//no output

用split的正确做法是:加转义符号

$test1 = end(split('.','abc.txt'));

echo $test1;//output txt

 
分析:"." 符号是正则表达式的关键字所以split无效,而explode有效。


解析可能用斜线,点,或横线分割的日期:  

例子   2.   split()   例子

<?php
//   分隔符可以是斜线,点,或横线
$date   =   "04/30/1973 ";
list($month,   $day,   $year)   =   split   ( '[/.-] ',   $date);
echo   "Month:   $month;   Day:   $day;   Year:   $year <br   /> n ";
?>    


想仿效   Perl   中类似的   @chars   =   split( ' ',   $str)   行为,请参考   preg_split()   函数中的例子。  

注意   pattern   是一个正则表达式。如果想要用的分割字符是正则表达式中的特殊字符,要先将其转义。如果觉得   split()(或其它任何   regex   函数)行为古怪的话,请阅读包含在   PHP   发行包中   regex/   子目录下的   regex.7   文件。该文件是手册页面格式

在php中Constant与Define是常量那么下面我介绍一个方法能实现动态来使用Constant与Define值方法,希望对各位同学有所帮助。

PHP 要秀出 或 使用 动态 Constant / Define 值, 要如何使用呢? ex: 下述范例是动态变数, 但是动态 Constant 要如何使用?

 代码如下 复制代码


<?php
$a = 'abc';
$b = 'a';
echo $$b; // 印出 abc
?>


PHP 使用 动态 Constant / Define 值
可以使用 constant() 来达成使用 Constant 的值, 范例如下:

 代码如下 复制代码

<?php
define('PKEY1', 'abc');
define('PKEY2', 'def');
$i = 1;
$a = 'PKEY';
echo constant($a . $i); // abc
echo constant($a . ++$i); // def
?>

在php中检测字符串编码的方法有很多,最常用的就是直接使用mb_detect_encoding函数了,但还有更高级的办法就是使用字符的ascii值来判断哦。

例1

 代码如下 复制代码

function is_utf8($str)
{
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}

1、方法1

 代码如下 复制代码

function mb_is_utf8($string)  
{  
    return mb_detect_encoding()($string, 'UTF-8') === 'UTF-8';//新发现  

2、方法2

 代码如下 复制代码

function preg_is_utf8($string)  
{  
    return preg_match('/^.*$/u', $string) > 0;//preg_match('/^./u', $string)  

标签:[!--infotagslink--]

您可能感兴趣的文章: