PHP服务器文件管理器开发小结(八):更多的操作——重命名、移动、删除

这一节介绍几个简单的文件操作的PHP实现:使用rename进行文件和文件夹的重命名以及移动,及使用unlink删除文件和使用rmdir删除文件夹。

rename函数的基本语法是

rename($oldname, $newname)

即将$oldname对应的文件或文件夹重命名为$newname对应的文件和文件夹。如果前后名称对应的是同一路径,则该函数仅尝试重命名,否则将尝试移动文件并重命名。

使文件和文件夹重命名的情况基本类似,因此采用同一的处理模式:

if (is_writable($filePath)) $info.= "<li><a href=\"#\" title=\"rename\" onClick=\"onElemAct(‘rename‘,‘$filePath‘)\"><img src=\"images/rename32.png\" alt=\"\" class=\"tabmenu\"/></a></li>";

前端使用jQueryUI提示用户:

	case "rename":
		var strOldFileName = strViewPath.substr(strViewPath.lastIndexOf(‘/‘)+1);
		$(‘#textRename‘).val(strOldFileName);
		$(‘#dialogRename‘).dialog({
			height:‘auto‘,
			width:‘auto‘,
			position:{my:‘center‘,at:‘center‘,collision:‘fit‘},
			modal:false,
			draggable:true,
			resizable:true,
			title:"Rename File",
			show:‘slide‘,
			hide:‘explode‘,
			buttons:{
				OK: function() {
					var strNewFileName = $(‘#textRename‘).val();
					if (strNewFileName == "") return;
					$.post("query.php", {act:"rename", file:strViewPath, content:strNewFileName}, function (data) {
				        $(‘#spanDirTable‘).html(data);
			        	$( ‘#dialogRename‘ ).dialog( "close" );
				    });
				},
				Cancel: function() {
		        	$( this ).dialog( "close" );
		        }
			}
		});
		break;

对应的“原材料”:

<div id="dialogRename" style="display:none">
	<strong>Rename Element:<br/></strong>
	Please input New Element Name:<input type="text" id="textRename"/>
</div>

注意,这里在前端通过分析路径字符串提取出了原文件名。

对应的PHP响应:

            case "rename":
                $isDirContentView = true;
                if (isset($_SESSION["currDir"])) 
                {
                    $strDirName = $_SESSION["currDir"];
                }
                else  $strDirName = "/home";
                if (isset($_POST["file"]) && isset($_POST["content"]))
                {
                    $strFilePath = $_POST["file"];
                    $strDirPath = dirname($strFilePath);
                    $strNewPath = $strDirPath."/".$_POST["content"];
                    if (!file_exists($strNewPath) && rename($strFilePath, $strNewPath))
                    {
                        echo "<script>alert(‘Element \"$strFilePath\" Rename to \"$strNewPath\" Succeed!‘)</script>";
                    }
                    else 
                    {
                        echo "<script>alert(‘Element \"$strFilePath\" Rename Failed!‘)</script>";
                    }
                }
                break;

注意,这里通过$isDirContentView = true;使得重命名后刷新文件夹内容。

具体效果:

移动文件需要输入目标路径名,这里通过jQueryUI要求用户输入,并保持移动前后文件名不变。

生成文件列表图片链接:

    if (is_writable($filePath)) $info.= "<li><a href=\"#\" title=\"moveto\" onClick=\"onElemAct(‘move‘,‘$filePath‘)\"><img src=\"images/moveto32.png\" alt=\"\" class=\"tabmenu\"/></a></li>";

前端对话框响应:

	case "move":
		$(‘#fileToMove‘).text(strViewPath);
		$(‘#dialogMoveFile‘).dialog({
			height:‘auto‘,
			width:‘auto‘,
			position:{my:‘center‘,at:‘center‘,collision:‘fit‘},
			modal:false,
			draggable:true,
			resizable:true,
			title:"Move File",
			show:‘slide‘,
			hide:‘explode‘,
			buttons:{
				OK: function() {
					strTargetDir = $(‘#textMoveToDir‘).val();
					//alert(strTargetDir);
					if (strTargetDir == "") return;
					$.post("query.php", {act:"moveFile", file:strViewPath, content:strTargetDir}, function (data) {
				        $(‘#spanDirTable‘).html(data);
			        	$( ‘#dialogMoveFile‘ ).dialog( "close" );
				    });
				},
				Cancel: function() {
		        	$( this ).dialog( "close" );
		        }
			}
		});
		break;

对应“原材料”:

<div id="dialogMoveFile" style="display:none">
	Move File ‘<span id="fileToMove"></span>‘ To:<br/>
	Please input Dir Path:<input type="text" id="textMoveToDir"/>
</div>

对应的后端响应:

            case "moveFile":
                $isDirContentView = true;
                if (isset($_SESSION["currDir"])) 
                {
                    $strDirName = $_SESSION["currDir"];
                }
                else  $strDirName = "/home";
                if (isset($_POST["file"]) && isset($_POST["content"]))
                {
                    $strFilePath = $_POST["file"];
                    $strFileName = basename($strFilePath);
                    $strMoveToDir = $_POST["content"];
                    if (!is_dir($strMoveToDir))
                    {
                        echo "<script>alert(‘Target Dir \"$strMoveToDir\" Is Not Valid!‘)</script>";
                        break;
                    }
                    if (!is_writable($strMoveToDir))
                    {
                        echo "<script>alert(‘Target Dir \"$strMoveToDir\" Is Not Writable!‘)</script>";
                        break;
                    }
                    $strMoveToPath = $strMoveToDir."/".$strFileName;
                    if (file_exists($strMoveToPath))
                    {
                        echo "<script>alert(‘Target Path \"$strMoveToPath\" Exists!‘)";
                        break;
                    }
                    if (rename($strFilePath, $strMoveToPath))
                    {
                        echo "<script>alert(‘File \"$strFilePath\" Move to \"$strMoveToPath\" Succeed!‘)</script>";
                    }
                    else 
                    {
                        echo "<script>alert(‘File \"$strFilePath\" Move to \"$strMoveToPath\" Failed!‘)</script>";
                    }
                }
                break;

PHP通过basename获取原路径文件名,并与目标路径结合组成目标文件名,之后尝试rename文件移动。

具体效果:

删除文件需要使用unlink函数,基本流程同重命名类似。

文件列表图标链接:

if (is_writable($filePath)) $info.= "<li><a href=\"#\" title=\"delete\" onClick=\"onElemAct(‘deletefile‘,‘$filePath‘)\"><img src=\"images/delete32.png\" alt=\"\" class=\"tabmenu\"/></a></li>";

对应前端响应:

            case "deletefile":
		$(‘#fileToDelete‘).text(strViewPath);
		$(‘#dialogDeleteFile‘).dialog({
			height:‘auto‘,
			width:‘auto‘,
			position:{my:‘center‘,at:‘center‘,collision:‘fit‘},
			modal:false,
			draggable:true,
			resizable:true,
			title:"Delete File",
			show:‘slide‘,
			hide:‘explode‘,
			buttons:{
				OK: function() {
					$.post("query.php", {act:"deleteFile", file:strViewPath}, function (data) {
				        $(‘#spanDirTable‘).html(data);
			        	$( ‘#dialogDeleteFile‘ ).dialog( "close" );
				    });
				},
				Cancel: function() {
		        	$( this ).dialog( "close" );
		        }
			}
		});
		break;

“原材料”:

<div id="dialogDeleteFile" style="display:none">
	Are you sure to delete file ‘<span id="fileToDelete"></span>‘?
</div>

服务端响应:

            case "deleteFile":
                $isDirContentView = true;
                if (isset($_SESSION["currDir"])) 
                {
                    $strDirName = $_SESSION["currDir"];
                }
                else  $strDirName = "/home";
                if (isset($_POST["file"]))
                {
                    $strFileName = $_POST["file"];
                    if (unlink($strFileName))
                    {
                        echo "<script>alert(‘File \"$strFileName\" Delete Succeed!‘)</script>";
                    }
                    else 
                    {
                        echo "<script>alert(‘File \"$strFileName\" Delete Failed!‘)</script>";
                    }
                }
                break;

具体效果:

删除文件夹需要用到rmdir函数,然而rmdir函数仅能删除空文件夹,如果需要将带有内容的文件夹整个删除需要递归删除。下面是作者设计的递归删除文件夹内容函数:

function removeDir($strDirName)
{
    if (!is_dir($strDirName)) return false;
    if (!($hDir = opendir($strDirName)))
    {
        return false;
    }
    $isSucceed = true;
    while (($fileName = readdir($hDir))!==false)
    {
        if ($fileName == "." || $fileName == "..") continue;
        $filePath = $strDirName."/".$fileName;
        if (is_file($filePath))
        {
            $isSucceed = unlink($filePath);
            if (!$isSucceed) break;
        }
        if (is_dir($filePath))
        {
            $isSucceed = removeDir($filePath);
            if (!$isSucceed) break;
        }
    }
    closedir($hDir);
    if ($isSucceed)
    {
        $isSucceed = rmdir($strDirName);
    }
    return $isSucceed;
}

使用这一函数代替rmdir即可对有内容的文件夹实现递归删除。下面给出具体代码实现。

首先是图标链接:

if (is_writable($filePath)) $info.= "<li><a href=\"#\" title=\"delete\" onClick=\"onElemAct(‘deletedir‘,‘$filePath‘)\"><img src=\"images/delete32.png\" alt=\"\" class=\"tabmenu\"/></a></li>";

然后是前端响应:

	    case "deletedir":
		$(‘#dirToDelete‘).text(strViewPath);
		$(‘#dialogDeleteDir‘).dialog({
			height:‘auto‘,
			width:‘auto‘,
			position:{my:‘center‘,at:‘center‘,collision:‘fit‘},
			modal:false,
			draggable:true,
			resizable:true,
			title:"Delete Directory",
			show:‘slide‘,
			hide:‘explode‘,
			buttons:{
				OK: function() {
					$.post("query.php", {act:"deleteDir", file:strViewPath}, function (data) {
				        $(‘#spanDirTable‘).html(data);
			        	$( ‘#dialogDeleteDir‘ ).dialog( "close" );
				    });
				},
				Cancel: function() {
		        	$( this ).dialog( "close" );
		        }
			}
		});
		break;

对应“原材料”:

<div id="dialogDeleteDir" style="display:none">
	Are you sure to delete directory ‘<span id="dirToDelete"></span>‘ and remove all files and sub-directories under it?
</div>

后端响应:

            case "deleteDir":
                $isDirContentView = true;
                if (isset($_SESSION["currDir"])) 
                {
                    $strDirName = $_SESSION["currDir"];
                }
                else  $strDirName = "/home";
                if (isset($_POST["file"]))
                {
                    $strFileName = $_POST["file"];
                    if (removeDir($strFileName))
                    {
                        echo "<script>alert(‘Directory \"$strFileName\" Delete Succeed!‘)</script>";
                    }
                    else 
                    {
                        echo "<script>alert(‘Directory \"$strFileName\" Delete Failed!‘)</script>";
                    }
                }
                break;

具体效果:

时间: 2024-10-09 00:37:17

PHP服务器文件管理器开发小结(八):更多的操作——重命名、移动、删除的相关文章

PHP服务器文件管理器开发小结(总结):总结、索引和源代码

PHP服务器文件管理器的开发经过前一阶段的介绍基本完成了功能搭建,包括目录的检索.增加.删除.重命名,文件的增加.浏览.修改.重命名.移动,以及文件的上传和下载等功能.本文对前一阶段工作的相关博文进行索引,并提供源代码供有兴趣的同学一同讨论. PHP服务器文件管理器开发小结(一):功能规划 本节讨论了文件管理器的目标功能和运行环境. PHP服务器文件管理器开发小结(二):版面设计和css 本节讨论了页面布局所需的css内容,并介绍了引入jQuery和jQueryUI的方法. PHP服务器文件管理

PHP服务器文件管理器开发小结(一):功能规划

为了更好的学习PHP.AJAX和LAMP等,为搭建PHP服务器打下基础,作者尝试开发一款基于PHP的服务器文件管理器,并且在管理过程中使用AJAX而不刷新页面. 文件管理器包含以下基本操作 当前文件夹 回到首文件夹 回到上一级文件夹 刷新文件夹视图 上传文件 新建文件 新建子文件夹 文件操作 查看内容 编辑内容 下载 重命名 移动 删除 文件夹操作 重命名 删除 基本上实现了以上功能后,一个比较完善的服务器文件管理器就形成了. 注意,本示例仅考虑Apache可操作的权限,不考虑提权的情况. 管理

PHP服务器文件管理器开发小结(三):使用jQuery提交AJAX请求

本节将讨论使用jQuery提交AJAX请求的基本方法,并完成显示首文件夹的基本方法. 同时,本节也将讨论使用图片链接提交请求的基本方法. jQuery是一套强大的JS库,将复杂的JS操作封装成简洁的语句,并提供对AJAX的支持.通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本.HTML.XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中.编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现

PHP服务器文件管理器开发小结(二):版面设计和css

首先是引用jQuery和jQueryUI的方法,为了减轻服务器的压力,作者引用了第三方的源: <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.

PHP服务器文件管理器开发小结(七):应用jQueryUI预览服务器图片

上一节讨论了利用jQueryUI实现用户友好的新建.查看和编辑文件的界面.然而,这些界面都是针对纯文本的,如果是图像的话,查看文件仅提供纯文本就很不友好了.因此,需要为前端提供图像浏览的方法. 先提供前端JavaScript的代码,首先是"原材料": <div id="dialogImage" style="display:none"> <img  src="" id="imgView"/

PHP服务器文件管理器开发小结(九):jQuery动态表单实现文件下载

前文讨论的文件操作,无论是新建.编辑.移动.删除,都是服务端对本地文件系统的操作.这一节需要讨论一个涉及服务端和客户端协调进行的操作:文件下载. 简单的文件下载可以通过将相对路径写入超链接的方式进行,然而这样仅限于服务端Apache有下载权限的文档,如果需要支持对更多文件进行下载,仅仅使用这一方式就远远不够了.这里需要利用PHP的能力,在服务端"取出"文件并"推送"给客户端. 首先是生成下载图标链接: if (is_readable($filePath)) $inf

PHP服务器文件管理器开发小结(十):使用jQuery和iframe实现AJAX文件上传

上一节讨论了文件下载,这一节继续讨论文件上传. 众所周知,前端上传文件比较简单的办法就是使用文件控件<input type="file"/>.然而,如果我们需要上传过程是AJAX的,亦即上传过程不刷新页面,仅反馈需要的信息,那就需要更加精巧的设计了. 首先是上传文件图片链接: <li><a href="#" title="upload" onClick="onUploadFile()">&l

PHP服务器文件管理器开发小结(六):使用jQueryUI实现新建、查看和编辑文件

前面几节所做的操作都是对服务器内容的读取,下面开始探讨若干会牵扯到修改服务器的操作. 首先是在当前文件夹下新建文件,对应着文件夹上方的New File菜单项. <li><a href="#" title="new file" onClick="onNewFile()"><img src="images/newfile48.png" class="topmenu" />&l

PHP服务器文件管理器开发小结(四):利用SESSION响应文件夹导航

书接上回,在首文件夹(HOME)图标的旁边是回到上级文件夹(UP)和刷新当前文件夹(REFRESH)两个图标,对应的图片链接为:         <li><a href="#" title="up" onClick="onUp()"><img src="images/upfolder48.png" class="topmenu" /></a></li&g