php 文件夹管理器实现代码
主要功能:
1:文件的或者文件夹的copy
2:文件或者文件夹的delete
3:遍历文件夹得到目录下文件夹二维数组
4:获取文件夹或者文件夹权限
5:文件大小换算为大计量单位
<?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
/**
 +----------------------------------------------------------
 * 兄 弟 你 该 努 力 了!- 西 木
 +----------------------------------------------------------
 * 用 途 文件管理
 +----------------------------------------------------------
 * 文 件 名  File.class.php
 +----------------------------------------------------------
 * 时 间 2011-1-10
 +----------------------------------------------------------
 */
 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);
   }
 }
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号