主要功能:
---文件的或者文件夹的copy
---文件或者文件夹的delete
---获取文件夹或者文件夹权限
--文件大小换算为大计量单位
---遍历文件夹得到目录下文件夹二维数组
主要功能:
---文件的或者文件夹的copy
---文件或者文件夹的delete
---获取文件夹或者文件夹权限
--文件大小换算为大计量单位
---遍历文件夹得到目录下文件夹二维数组
<?php /** * 文件操作模型 */ class M_files { public $shearplate=''; //剪切板 /** * 构造函数 */ public function __construct() { !isset($_SESSION) && session_start(); //开启session $this->shearplate=$_SESSION['shearplate']; //获取剪切板内容 is_dir($_SESSION['chdir']) && chdir($_SESSION['chdir']); //当前目录 } /** * 遍历目录 * @access public * @param string dir * @return array 二维数组array(name=>array(size,mtime,type,power)) */ public function get($dir=''){ $dirs=array(); //目录文件数组 $dir=is_dir($dir)?$this->set_path($dir):'.'; $this->set_chdir($dir); //修改当前目录,确保路径正确 if($handle=opendir($dir)){ $cwd=$this->set_path(getcwd()); //当前工作目录 while(false!==($file=readdir($handle))){ //遍历目录 if($file != "." ){//&& $file != ".."){ //去掉 . 和 .. $file_arr=array( //文件的详细信息 'size' =>filesize($file), //文件大小 'mtime' =>filemtime($file), //文件修改时间 'type' =>$this->get_type($file), //文件类型(目录-dir,文件:rar、jpg) 'power' =>$this->get_power($file), //文件权限 'path' =>$this->set_path($cwd.$file) //文件完整路径 ); $dirs+=array($file=>$file_arr); //得到二维文件信息数组 } } } closedir($handle); //关闭目录 return $dirs; } /** * 获取目录权限 * @access public * @param string dir 目录 * @return string power 权限 */ public function get_power($dir){ $perms = fileperms($dir); if (($perms & 0xC000) == 0xC000) { // Socket $info = 's'; } elseif (($perms & 0xA000) == 0xA000) { // Symbolic Link $info = 'l'; } elseif (($perms & 0x8000) == 0x8000) { // Regular $info = '-'; } elseif (($perms & 0x6000) == 0x6000) { // Block special $info = 'b'; } elseif (($perms & 0x4000) == 0x4000) { // Directory $info = 'd'; } elseif (($perms & 0x2000) == 0x2000) { // Character special $info = 'c'; } elseif (($perms & 0x1000) == 0x1000) { // FIFO pipe $info = 'p'; } else { // Unknown $info = 'u'; } // Owner $info .= (($perms & 0x0100) ? 'r' : '-'); $info .= (($perms & 0x0080) ? 'w' : '-'); $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); // Group $info .= (($perms & 0x0020) ? 'r' : '-'); $info .= (($perms & 0x0010) ? 'w' : '-'); $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); // World $info .= (($perms & 0x0004) ? 'r' : '-'); $info .= (($perms & 0x0002) ? 'w' : '-'); $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); return $info; } /** * 获取文件类型 * @access public * @param string file 文件 * @return string type 文件类型 */ public function get_type($file){ if(is_file($file)){ $path=pathinfo($file); return $path['extension']; //获得后缀 } else{ return 'dir'; //目录返回dir } } /** * 复制文件或文件夹 * @access public * @param string dir 目标(路径或重命名后的文件) * @param string files 当前文件,如果为空,调用剪贴板(/xx/xx.html|zz/xx/|xxx.htm) * @return bool true/false */ public function copy_files($goal,$files=''){ $falg=true; //遇见错误将标记设置为false empty($files)?$files=$this->shearplate:$files; //调用剪切板 $path=$goal=$this->set_path($goal); //统一路径,并保存目标目录初始值 $files=$this->set_path($files); //统一路径 $file_arr=explode('|',trim($files,'|')); foreach($file_arr as $file){ //循环处理需要复制的文件 $filename=basename($file); while(file_exists($goal.$filename)){ //得到新路径 $filename='复件 '.$filename; //确保同一文件复制多次正确 } $goal=$goal.$filename; if(is_file($file)){ $falg= @copy($file,$goal); //移动文件 } else{ $falg= @$this->copy_dir($file,$goal); //移动目录 } $goal=$path; //重置路径,否则会命名出错 } return $falg; } /** * 移动文件或文件夹 * @access public * @param sting dir 目标(路径或重命名后的文件) * @param sting files 当前文件,如果为空,调用剪贴板(/xx/xx.html|zz/xx/|xxx.htm) * @return bool */ public function move_files($goal,$files=''){ $falg=true; //遇见错误将标记设置为false !$this->copy_files($goal,$files) && $falg=false; //移动文件 $falg && (!$this->del_files($files) && $falg=false); //删除文件 return $falg; } /** * 复制文件夹 * @access public * @param string 复制文件夹 * @param string 目标文件夹 * @return bool ture/false */ private function copy_dir($source,$target){ $source=rtrim($source,'/').'/'; $target=rtrim($target,'/').'/'; if(is_dir($source)){ if(@!mkdir($target)){ return false; } $d=dir($source); while(($entry=$d->read())!==false){ if(is_dir($source.$entry)){ if($entry=="."||$entry==".."){ continue; } else{ $this->copy_dir($source.$entry,$target.$entry); } } else{ if(!copy($source.$entry,$target.$entry)){ return false; } } } } else{ if(@!copy($source,$target)){ return false; } } return true; } /** * 删除文件或目录 * @access public * @param sting files(/xxxx/xxxx|xxx.html) * @return bool true/false */ public function del_files($files){ $falg=true; $files=$this->set_path($files); //统一路径 $file_arr=explode('|',trim($files,'|')); foreach($file_arr as $key=>$file){ //循环处理需要删除的文件 if(is_file($file)){ !unlink($file) && $falg=false; } elseif(is_dir($file)){ //删除目录 file_exists($this->get_chdir().$file) && $file=$this->get_chdir().$file; //得到物理路径 !$this->del_dir($file) && $falg=false; } } return $falg; } /** * 删除目录 * @access private * @param string dir * @return bool */ private function del_dir($dir){ $dir=$this->set_path($dir); @$hand = opendir($dir); while(false!==($f = readdir($hand))) { if($f=='.'||$f=='..') continue; if(is_dir($dir.$f)) { $this->del_dir($dir.$f .'/'); } else { @unlink($dir . $f ); } } @closedir($hand); //关闭文件 return @rmdir($dir); } /** * 换算文件大小 * @access public * @param int bit * @return string */ public function byte2big($size){ $unit=1024; $mb=$size/($unit*$unit); $kb=$size/$unit; $bit=$size; ($bit>=1) && $str=$bit.'bit'; ($kb>=1) && $str=number_format($kb, 2, '.', '').'kb'; ($mb>=1) && $str=number_format($mb, 2, '.', '').'mb'; return $str; } /** * 统一路径 * @access public * @param string dir * @return string dir */ public function set_path($dir){ if(is_dir($dir) or substr($dir,-1)=='/'){ //目录 return rtrim(strtr($dir,array('\\'=>'/')),'/').'/'; } else{ return strtr($dir,array('\\'=>'/')); } } /** * 修改当前目录 * @access public * @param sting dir */ public function set_chdir($dir){ chdir($dir); // setcookie('chdir',$dir); //通过写入cookie保存当前目录 $_SESSION['chdir']=$dir; //通过session保存当前目录 } /** * 获取当前目录 */ public function get_chdir(){ return $this->set_path(rtrim(getcwd(),'/').'/'); } /** * 析构函数 */ public function __destruct(){ $_SESSION['shearplate']=$this->shearplate; //剪切板内容写入session以便跨页面使用 } } ?>
完成动作请求
<?php class Files extends Admin{ private $mode=null; public function __construct(){ parent::__construct(); $this->mode=$this->LoadModel("M_files"); //加载文件管理模型 } /** * 默认动作 */ public function index(){ $this->show(); } /** * 拷贝 */ public function fcopy(){ if(!empty($_GET['f'])){ $path=$this->mode->get_chdir(); $shearplate_arr=explode('|',trim($_GET['f'],'|')); foreach($shearplate_arr as $file){ empty($shearplate)? $shearplate=$path.$file:$shearplate=$shearplate.'|'.$path.$file; } $this->mode->shearplate=$shearplate; } $this->gotourl(-1); } /** * 剪切 */ public function fcut(){ //如果为剪切,剪切板最后加! if(!empty($_GET['f'])){ $path=$this->mode->get_chdir(); $shearplate_arr=explode('|',trim($_GET['f'],'|')); foreach($shearplate_arr as $file){ empty($shearplate)? $shearplate=$path.$file:$shearplate=$shearplate.'|'.$path.$file; } $this->mode->shearplate=$shearplate.'!'; } $this->gotourl(-1); } /** * 粘贴 */ public function fpaste(){ $shearplate=$this->mode->shearplate; if(substr($shearplate,-1)=='!'){ $shearplate=rtrim($shearplate,'!'); $flag=true; } $goal=$this->mode->get_chdir(); if($flag){ $this->mode->move_files($goal,$shearplate)? $this->gotourl(-1):$error=true; //剪切 } else{ $this->mode->copy_files($goal,$shearplate)? $this->gotourl(-1):$error=true; //拷贝 } if($error){ $this->assign('title','操作错误'); $this->assign('msg','操作失败<br><a href="#" onclick="history.go(-1)" >返回</a>'); $this->display('msg.html'); } } /** * 浏览文件夹 */ public function show(){ ($_GET['dir']=='..:') && $_GET['dir']=''; $_GET['dir']=strtr($_GET['dir'],array(':'=>'/')); $files=$this->mode->get(ROOT_PATH.'/'.$_GET['dir']); $top=ltrim(strtr($files['..']['path'],array('/'=>':')),ROOT_PATH); $top=$this->seturl("index.php/admin/files/show/dir/".strtr($top,array(' '=>'%20')),2); //上级目录连接 $files_str='<div class="webftp" id="webftp">'; $files_str=$files_str."\r<div class=\"top\"><span class=\"ico\" style=\"".$this->get_ico('topdir')."\">" . "</span><span class=\"txt\"><a href=".$top.">". '上一层</a></span><span class="action">' . '<a title="创建文件夹" href="/admin/files/create/" class="ico" style="'.$this->get_ico('newdir').'"></a>'. '<a title="创建文件" href="/admin/files/create/file/new" class="ico" style="'.$this->get_ico('newfile').'"></a>'. '<a title="删除" href="#" onclick="webftp(\'del\')" class="ico" style="'.$this->get_ico('del').'"></a>' . '<a title="重命名" href="#" onclick="webftp(\'rn\');" class="ico" style="'.$this->get_ico('edit').'"></a>' . '<a title="剪切" href="#" onclick="webftp(\'cut\');" class="ico" style="'.$this->get_ico('cut').'"></a>' . '<a title="复制" href="#" onclick="webftp(\'copy\');" class="ico" style="'.$this->get_ico('copy').'"></a>' . '<a title="粘贴" href="/admin/files/fpaste/" class="ico" style="'.$this->get_ico('paste').'"></a>' . "</span></div>\r<ul>"; foreach($files as $key=>$value){ //输出目录 if($value['type']=='dir'){ $link=ltrim(strtr($value['path'],array('/'=>':')),ROOT_PATH); $link=$this->seturl("index.php/admin/files/show/dir/".strtr($link,array(' '=>'%20')),2); if($key=='..'){ } else{ $files_str=$files_str."\r<li><span class=\"ico\" style=\"".$this->get_ico($value['type'])."\">" . "</span><a href=$link>".$key.'</a></li>'; } } } foreach($files as $key=>$value){ //输出文件 if($value['type']!='dir'){ $files_str=$files_str."\r<li><span class=\"ico\" style=\"".$this->get_ico($value['type'])."\"></span>". "<a href=#>".$key.'</a><span class="size">'.$this->mode->byte2big($value['size']).'</span></li>'; } } $files_str=$files_str.'</ul></div>'; $this->assign('msg',$files_str); $this->assign('title','webftp'); $this->display('msg.html'); } /** * 新建文件或者文件夹 */ public function create(){ if(empty($_POST['newfile']) & empty($_POST['newdir'])){ if(empty($_GET['file'])){ $msg='创建文件夹:<form action="" method="post"><input name="newdir" type="text" size="20"><br/>' . '<input type="submit" value="创建文件夹"></form>'; } else{ $msg='创建文件:<form action="" method="post"><input name="newfile" type="text" size="20"><br/>' . '<input type="submit" value="创建文件"></form>'; } $msg=$msg.'<br><a href="#" onclick="history.go(-1);">返回</a>'; $this->assign('title','新建文件'); $this->assign('msg',$msg); $this->display('msg.html'); } else{//创建 $path=$this->mode->get_chdir(); if(!empty($_POST['newdir'])){ $flag=mkdir($path.$_POST['newdir']); } else{ $flag=fopen($path.$_POST['newfile'],'a'); !$flag && fclose($flag); } $flag && $this->gotourl(-2); } } /** * 重命名文件夹或者文件 */ public function rn(){ if(!empty($_POST['newname'])){ $path=$this->mode->get_chdir(); if(@rename($path.$_GET['f'],$path.$_POST['newname'])){ $this->gotourl(-2); } else{ $this->assign('title','重命名失败'); $this->assign('msg','文件'.$_GET['f'].'命名失败!<br><a href="#" onclick="history.go(-1);">返回</a>'); $this->display('msg.html'); } } else{ $this->assign('title','重命名文件'); $this->assign('msg','将文件[<font color="red">'.$_GET['f'].'</font>]命名为:<form action="" method="post">' . '<input name="newname" tpye="text" size="20" />' . '<br/><input type="submit" value="提交"></form><br><a href="#" onclick="history.go(-1);">返回</a>'); $this->display('msg.html'); } } /** * 删除文件 */ public function del(){ if(!$_GET['f']==''){ $flag=true; if($this->mode->del_files($_GET['f'])){ $this->gotourl(-1); } else{ $this->assign('title','删除失败!'); $this->assign('msg','文件'.$_GET['dir'].'删除失败!'); $this->display('msg.html'); } } else{ $this->gotourl(-1); //没有删除对象,返回 } } /** * 输出style */ private function set_ico($abc,$num){ $witht=16; //块宽 $height=16; //块高 $num_arr=range(1,26); $abc_arr=range(a,z); $abc_arr=array_combine($abc_arr,$num_arr); //a=>1,b=>2 return "background-position:-".$abc_arr[$abc]*$witht."px -".$num*$height."px;"; } /** * ico 映射 */ private function get_ico($type){ $icos=array('default' => 'e,4', 'txt' => 'h,6', //文本文件 'php' => 'a,3', //php文件 'gz' => 'a,3', //gz压缩格式 'dir' => 'b,1', //文件夹 'del' => 'm,2', //删除 'edit' => 'q,7', //编辑 'cut' => 'j,2', //剪切 'copy' => 'a,4', //复制 'paste' => 'b,5', //粘贴 'newdir' => 'h,1', //新建文件夹 'topdir' => 'n,6', //上级目录 'newfile' => 'c,4' //新建文件 ); empty($icos[$type])?$ico=$icos['default']:$ico=$icos[$type]; $str=explode(',',$ico); $abc=$str[0]; $num=$str[1]; return $this->set_ico($abc,$num); } }
评论列表
发表评论
热评文章
相关阅读