复制代码 代码如下:
<?php
error_reporting(2047);
/*
*ClassIO(SNakeVil完成03.25.04)(v1.0.0.0)
*
*[说明]
*本类用于对文件系统的处理。
*
*[功能]
*****list_dir($dir_path);
*读取指定目录内容,返回内容数组。
*$dir_path字符串,指定目录路径
*若有错误返回FALSE,否则返回
*array(
*"count"=>array("files","dirs","size"),
*"list"=>array(
*array("name","locate","type","size","last_access","last_change","last_modify"),
*......
*)
*)
*********
*********
*****seek_file($pattern,$dir_path,$seek_type,$sub_dir,$interal,$limit);
*根据正则表达式条件,在相应目录及给定层次的子目录中搜索匹配的文件、目录。
*$pattern符合PERL兼容标准的正则表达式,无须添加//,系统自行添加
*$seek_type有-101三种可能值,0仅文件夹,1仅文件,-1两者都包括
*$sub_dir数字值,搜索的子目录深度,指定目录不算,建议不要超过5
*$interal布尔值,为真则返回搜索结果的详细信息,否则只返回文件名、类型及所在目录
*$limit数字值,搜索结果限制,避免过度浪费系统资源
*若有错误返回FALSE,否则返回
*array(
*array(
*"name","locate","type"
*[,"size","last_access","last_change","last_modify"]
*),
*......
*)
*********
*********
*****delete($path);
*删除指定对象,文件或文件夹——包括内含子目录和文件的非空文件夹。
*$path字符串,指定要删除的内容路径,文件或目录均可
*如有错误在错误处中断,返回FALSE,否则返回TRUE
*********
*********
*****make_dir($path);
*建立任意文件夹,相对或绝对路径皆可,深层建立亦可。
*$path字符串,要建立的最终目录路径
*如有错误返回FALSE,否则返回TRUE
*********
*********
*****verify_file($src,$dst,$interal);
*使用MD5算法比较两个文件是否相同。
*$src字符串,源文件路径
*$dst字符串,目标文件路径
*$interal布尔值,对于大于1M文件,可以设置为FALSE以省去MD5检验步骤,减轻服务器负担
*若有错误返回FALSE,否则返回TRUE
*********
*********
*****copy($src_path,$dst_path);
*对任意文件夹、文件进行复制,相对或绝对路径皆可,文件复制完成后会进行效验,检查是否出错数据错误。
*$src_path字符串,指定要复制的源内容路径,文件或目录均可
*$dst_path字符串,指定要复制的目标内容路径,文件或目录均可,性质由$src_path决定,可为$src_path下层目录
*若有错误返回FALSE,否则返回TRUE
*********
*********
*****move($src_path,$dst_path);
*对任意文件夹、文件进行移动,相对或绝对路径皆可,文件移动完成后会进行效验,检查是否出错数据错误。
*$src_path字符串,指定要移动的源内容路径,文件或目录均可
*$dst_path字符串,指定要移动的目标内容路径,文件或目录均可,性质由$src_path决定,可为$src_path下层目录
*若有错误返回FALSE,否则返回TRUE
*
*[版权]
*风雨明清(SNakeVil@51js,SNakeVil@BU)独立设计完成,保留一切权力。
*随意使用,但请勿必保留下面的文本,谢谢!
*
*===========Z=================
*Class.IO.v1.0.0.0.build040325
*for.PHP.v4.20+
*bySNakeVil
*(snakevil@51js,snakevil@BU)
*--------+------
*QQ:118824
*MSN:snakevil_@hotmail.com
*HP:<ahref="http://www.snakevil.com/"target="_blank">http://www.snakevil.com/</a>
*===========Z=================
*
*/
classIO{
var$error_id;
var$result;
var$error_related;
var$last_exist_dir;
functionIO(){
$this->result=array();
$this->error_id=0x0000;
$this->error_related="";
$this->last_exist_dir="";
return$this;
}
functionerror_occur($error_id=0xffff,$error_related=""){//----0xffff----发生错误,但错误原因未知
if(is_int($error_id))$this->error_id=$error_id;//获取错误号
$this->error_related=$error_related;
returnfalse;//错误发生时返回FALSE方便进一步处理
}
functionlist_dir($dir_path="."){
if(!is_dir($dir_path))return$this->error_occur(0x0001,$dir_path);//----0x0001----指定目录不存在
if(!$dir_handle=@opendir($dir_path))return$this->error_occur(0x0002,$dir_path);//----0x0002----指定目录无权读取
$result=array(
"count"=>array("files"=>0,"dirs"=>0,"size"=>0),
"list"=>array()
);
while(false!==($file_handle=readdir($dir_handle))){//使用!==防止处理名称为0或FALSE的文件、目录
if($file_handle=="."||$file_handle=="..")continue;//忽略系统特定的两个文件夹
$temp=str_replace("","/",realpath($dir_path));
$temp=substr($temp,-1)=="/"?$temp:$temp."/";
$temp=array($temp,$file_handle);
$file_handle=$temp[0].$temp[1];//获取绝对地址
$temp=array(
"name"=>$temp[1],
"locate"=>$temp[0],
"type"=>@filetype($file_handle),
"size"=>filesize($file_handle),
"last_access"=>fileatime($file_handle),
"last_modify"=>filemtime($file_handle),
"last_change"=>filectime($file_handle)
);
switch($temp["type"]){
case"file":
$temp["type"]=1;
$result["count"]["files"]++;
$result["count"]["size"]+=$temp["size"];
break;
case"dir":
$temp["type"]=0;
$result["count"]["dirs"]++;
break;
default://!!!!鉴于Win32平台,对既非文件也非目录的内容忽略
$temp["type"]=-1;
}
$result["list"][]=$temp;
}
closedir($dir_handle);
unset($dir_handle,$file_handle,$temp);
clearstatcache();//清除文件系统缓存
return$this->result=$result;
}
functionseek_file($pattern=".*",$dir_path=".",$seek_type=1,$sub_dir=0,$interal=false,$limit=100){
/*规范一切可能的参数值*/
$pattern="/".$pattern."/";
$seek_type=intval($seek_type);
$seek_type=$seek_type>0?1:($seek_type<0?-1:0);
$sub_dir=abs(intval($sub_dir));
$interal=(bool)$interal;
$limit=abs(intval($limit));
if($limit==0)$limit=100;
$sub_dir_list=array(array($dir_path));//将查询目录作为子目录层次的第一层来对待
$result=array();
/*i当前处理的子目录层次,0为指定目录层,即仅处理一个目录*/
for($i=0;$i<=$sub_dir;$i++){
if(!isset($sub_dir_list[$i]))return$this->result=$result;//如果某一层子目录没有设置,说明实际目录系统中再无目录,返回
/*k每一子目录层次中子目录统计,j当前处理序号*/
for($j=0,$k=count($sub_dir_list[$i]);$j<$k;$j++){//根据每一层子目录数量处理
$l=$this->list_dir($sub_dir_list[$i][$j]);
if(!$l)return$this->result=$result;//出现错误,则立即停止返回现有结果
$l=$l["list"];
/*n每一子目录中文件、目录、其他项目统计,m为当前处理序号*/
for($m=0,$n=count($l);$m<$n;$m++){
if(count($result)>=$limit)return$this->result=$result;//如果要求数目已达到,返回
if($l[$m]["type"]==0)$sub_dir_list[$i+1][]=$l[$m]["locate"].$l[$m]["name"];//搜集下一层子目录信息
$o=$l[$m]["type"];
if($o!=$seek_type&&($seek_type==1||$seek_type==0))continue;//忽略不符合要求的项目
elseif($o==-1&&$seek_type==-1)continue;
if(!preg_match($pattern,$l[$m]["name"]))continue;//忽略不符合正则表达式的项目
$result[]=$interal?$l[$m]:array("name"=>$l[$m]["name"],"locate"=>$l[$m]["locate"],"type"=>$l[$m]["type"]);
}
}
}
unset($i,$j,$k,$l,$m,$n,$o,$sub_dir_list);
return$this->result=$result;
}
functiondelete($path=""){
if(!file_exists($path))return$this->error_occur(0x0003,$path);//----0x0003----指定对象不存在
if(is_dir($path)){
$path=str_replace("","/",realpath($path));
$path=substr($path,-1)=="/"?$path:$path."/";
$sub_list=array(array($path));
for($i=0;$i<count($sub_list);$i++){//使用COUNT($SUB_LIST)动态判断长度,从而有可能无定长循环
if(!isset($sub_list[$i]))break;//探索到最尽头,获得该目录下所有子目录列表,方便文件删除后删除目录
for($j=0,$k=count($sub_list[$i]);$j<$k;$j++){
$l=$this->list_dir($sub_list[$i][$j]);
if(!$l)return$this->error_occur("",$sub_list[$i][$j]);
$l=$l["list"];
for($m=0,$n=count($l);$m<$n;$m++){
$o=$l[$m]["locate"].$l[$m]["name"];
if($l[$m]["type"]==0)$sub_list[$i+1][]=$o;
elseif(!@unlink($o))return$this->error_occur(0x0004,$o);//删除目录下的每一个文件
}
}
}
for($i=count($sub_list)-1;$i>=0;$i--)//逆回删除目录
for($j=0,$k=count($sub_list[$i]);$j<$k;$j++)//删除每一个子目录直到指定目录
if(!@rmdir($sub_list[$i][$j]))return$this->error_occur(0x0005,$sub_list[$i][$j]);//----0x0005----目录无权删除
unset($i,$j,$k,$l,$m,$n,$o,$sub_list);
returntrue;
}elseif(@unlink($path))returntrue;
elsereturn$this->error_occur(0x0004,$path);//----0x0004----文件无权删除
}
functiongenerate_realpath($path=""){
if($path==""||!is_string($path))return$this->error_occur(0x0007,$path);//----0x0007----路径参数错误
$path=preg_replace("/(?<!^w)[:*?"<>|]/","",str_replace("","/",$path));//规范路径中多可能性的符号
if(substr($path,1,1)==":")return$path;//!!!!Win32平台的绝对路径
elseif(substr($path,0,1)=="/")returnsubstr(realpath("."),0,2).$path;//!!!!Win32平台下的绝对路径转换
else{
if(substr($path,-1)=="/")$path=substr($path,0,-1);//清除结尾可能的/符号
$path=preg_replace("//{2,}/","/",$path);//将///诸如类似的相连符号简化为一个
$path=explode("/",$path);//分割路径
$cur_path=explode("/",str_replace("","/",realpath(".")));
for($i=0,$j=count($path);$i<$j;$i++){
if($path[$i]=="..")array_pop($cur_path);
elseif($path[$i]=="."||$path[$i]==str_repeat(".",strlen($path[$i])))continue;//忽略无用的相对路径地址.和....等
elsearray_push($cur_path,$path[$i]);
}
$path=implode("/",$cur_path);
unset($cur_path);
return$path;
}
}
functionmake_dir($path=""){
if(!$path=$this->generate_realpath($path))returnfalse;
$path=explode("/",$path);
$i=array($path[0]);
for($i=0,$j=count($path),$k=array(),$l="";$i<$j;$i++){
array_push($k,$path[$i]);
$l=implode("/",$k);
if(!file_exists($l)){
if($this->last_exist_dir=="")$this->last_exist_dir=$l;
if(!@mkdir($l))return$this->error_occur(0x0008,$l);//----0x0008----无法创建目录
}
}
returntrue;
}
functionverify_file($src="",$dst="",$interal=true){
if(!file_exists($src)||!is_file($src))return$this->error_occur(0x000A,$src);//----0x000A----指定对象非文件
if(!file_exists($dst)||!is_file($dst))return$this->error_occur(0x000A,$dst);
$i=filesize($src);
if($i!=filesize($dst)){
unset($i);
returnfalse;
}
if($i>1024*1024*1024&&!$interal){//对于大于1MB的文件,如果不要求精确检查,跳过
unset($i);
returntrue;
}
unset($i);
if(md5_file($src)!=md5_file($dst))returnfalse;
returntrue;
}
functioncopy($src_path="",$dst_path=""){
if(!file_exists($src_path))return$this->error_occur(0x0003,$src_path);
if(!$dst_path=$this->generate_realpath($dst_path))returnfalse;
if(is_dir($src_path)){
$this->last_exist_dir="";//记录现行实际存在的目录
if(!$this->make_dir($dst_path))returnfalse;//建立目录失败
$src_path=str_replace("","/",realpath($src_path));
$src_path=substr($src_path,-1)=="/"?$src_path:$src_path."/";
$sub_list=array(array($src_path));
for($i=0;$i<count($sub_list);$i++){
if(!isset($sub_list[$i]))break;
for($j=0,$k=count($sub_list[$i]);$j<$k;$j++){
$l=$this->list_dir($sub_list[$i][$j]);
if(!$l)return$this->error_occur(0x0003,$sub_list[$i][$j]);
$l=$l["list"];
for($m=0,$n=count($l);$m<$n;$m++){
$o=$l[$m]["locate"].$l[$m]["name"];
if($o==$this->last_exist_dir)continue;//如果为上级目录向下级目录复制,防止死循环
$p=str_replace(substr($src_path,0,-1),$dst_path,$o);
if($l[$m]["type"]==0){
$sub_list[$i+1][]=$o;
if(!$this->make_dir($p))returnfalse;//对每一个子目录都予以建立
}else{//对每一个文件进行复制
if($this->verify_file($o,$p))continue;//如果目标与源完全相同,不再复制
if(!copy($o,$p)||!$this->verify_file($o,$p))return$this->error_occur(0x0009,$o);//----0x0009----文件移动失败
}
}
}
}
unset($i,$j,$k,$l,$m,$n,$o,$p,$sub_list);
returntrue;
}else{
if(!is_readable($src_path))return$this->error_occur(0x0006,$src_path);//----0x0006----源文件无权读取
if($this->verify_file($src_path,$dst_path))returntrue;
$i=strrpos($dst_path,"/");
$dst_path=array(substr($dst_path,0,$i),substr($dst_path,$i+1));
unset($i);
if(!$this->make_dir($dst_path[0]))returnfalse;
$dst_path=implode("/",$dst_path);
if(!copy($src_path,$dst_path)||!$this->verify_file($src_path,$dst_path))return$this->error_occur(0x0009,$src_path);
returntrue;
}
}
functionmove($src_path="",$dst_path=""){
if(!file_exists($src_path))return$this->error_occur(0x0003,$src_path);
if(!$dst_path=$this->generate_realpath($dst_path))returnfalse;
if(is_dir($src_path)){
$this->last_exist_dir="";
if(!$this->make_dir($dst_path))returnfalse;
$src_path=str_replace("","/",realpath($src_path));
$src_path=substr($src_path,-1)=="/"?$src_path:$src_path."/";
$sub_list=array(array($src_path));
for($i=0;$i<count($sub_list);$i++){
if(!isset($sub_list[$i]))break;
for($j=0,$k=count($sub_list[$i]);$j<$k;$j++){
$l=$this->list_dir($sub_list[$i][$j]);
if(!$l)return$this->error_occur(0x0003,$sub_list[$i][$j]);
$l=$l["list"];
for($m=0,$n=count($l);$m<$n;$m++){
$o=$l[$m]["locate"].$l[$m]["name"];
if($o==$this->last_exist_dir)continue;
$p=str_replace(substr($src_path,0,-1),$dst_path,$o);
if($l[$m]["type"]==0){
$sub_list[$i+1][]=$o;
if(!$this->make_dir($p))returnfalse;
}else{
if($this->verify_file($o,$p))continue;
if(!copy($o,$p)||!$this->verify_file($o,$p))return$this->error_occur(0x0009,$o);
if(!@unlink($o))return$this->error_occur(0x0004,$o);
}
}
}
}
for($i=count($sub_list)-1;$i>=0;$i--)
for($j=0,$k=count($sub_list[$i]);$j<$k;$j++)
if(strpos($this->last_exist_dir,$sub_list[$i][$j])!==false)continue;//对移动目标目录的上层目录,不予考虑删除
elseif(!@rmdir($sub_list[$i][$j]))return$this->error_occur(0x0005,$sub_list[$i][$j]);
unset($i,$j,$k,$l,$m,$n,$o,$p,$sub_list);
returntrue;
}else{
if(!is_readable($src_path))return$this->error_occur(0x0006,$src_path);
if($this->verify_file($src_path,$dst_path))returntrue;
$i=strrpos($dst_path,"/");
$dst_path=array(substr($dst_path,0,$i),substr($dst_path,$i+1));
unset($i);
if(!$this->make_dir($dst_path[0]))returnfalse;
$dst_path=implode("/",$dst_path);
if(!copy($src_path,$dst_path)||!$this->verify_file($src_path,$dst_path))return$this->error_occur(0x0009,$src_path);
if(@unlink($src_path))returntrue;
elsereturn$this->error_occur(0x0004,$src_path);
}
}
}
?>