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);
   }
 }

posted on 2011-01-12 16:00  justup  阅读(2331)  评论(0)    收藏  举报

导航