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