PHP文件夹操作,遍历目录,删除和新建目录,复

zxh5566  2016-08-19 19:40   Hits: 

1、遍历目录

在进行PHP编程的时候,需要对服务器某个目录下面的文件进行浏览,通常称为遍历目录,取得一个目录下的文件和子目录,就需要用到opendir()函数,readdir()函数,closedir()函数和rewinddir()函数

函数 opendir()用于打开指定目录,接受一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄,如果该目录不存在或者没有访问权限,则返回false。
函数redadir()用于读取指定目录,接收已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位,当指针位于目录的结尾时,因为没有文件存在则返回false
函数closedir()关闭指定指针,接收已经用opendir()函数打开的可操作目录句柄作为参数,函数无返回值,运行后将关闭打开的目录。
函数rewinddir()倒回目录句柄,接收已经用opendir()函数打开的可操作目录句柄作为参数,将目录指针重置目录开始处,即倒回目录的开头
<?php
$num = 0;
$dirname = 'phpMyadmin';
$dir_handle = opendir($dirname);
echo '<table>';
echo '<option><h2>目录'.$dirname.'下面的内容</h2></caption>';
echo '<tr align="left" bgcolor="#ccc">';
echo '<th>文件名</th><th>文件大小</th><th>文件类型</th><th>修改时间</th>';
while($file=readdir($dir_handle)){
$dirFile = $dirname."/".$file;
if($num++%2==0){
$bgcolor='#ffffff';
}else{
$bgcolor='#cccccc';
}
echo'<tr bgcolor='.$bgcolor.'>';
echo'<td>'.$file.'</td>';
echo'<td>'.filesize($dirFile).'</td>';
echo'<td>'.filetype($dirFile).'</td>';
echo'<td>'.date("Y/n/t",filemtime($dirFile)).'</td>';
}
echo '</table>';
closedir($dir_handle);
echo '在<b>'.$dirname.'</b>目录下的子目录和文件夹共有<b>'.$num.'</b>个';
?>
上述程序首先打开一个目录指针,并对其进行遍历,遍历目录时,会包括"."和".."两个特殊的目录,如果不需要这两个目录可以将其屏蔽,当然,显示细节会因为文件夹中内容的不同而有所不同。通过上述可见,在PHP中浏览文件夹中的内容页并不是一件多么复杂的事情,而且PHP还提供了一种面向对象的方式用于目录的遍历,通过使用dir类完成,不仅如此,PHP也可以按用户的要求检索目录下指定的内容,提供了glob()函数检索指定的目录,该函数最终返回一个包含检索结果的数组。

2、统计目录大小

计算文件,磁盘分区和目录的大小在各种应用程序中都是常见的任务。计算文件的大小可以通过我们前面介绍过的filesie()函数完成,统计磁盘大小也可以用disk_free_space()和disk_total_space()两个函数实现,但PHP目前并没有提供目录总大小的标准函数,因此我们要定义一个函数来完成这个任务,首先考虑计算的目标中有没有包含其他子目录的情况,如果没有子目录,目录下所有文件的大小相加就是目录大小,如果包含子目录就按照这个方法再计算一下子目录大小,使用递归函数看来最适合此任务。计算目录大小的自定义函数如下:

<?php
function dirSize($directory){
$dir_size = 0;
if($dir_handle = @opendir($directory)){
while($filename=readdir($dir_handle)){
if($filename!='.'&&$filename!='..'){
$subFile = $directory.'/'.$filename;
if(is_dir($subFile)){
$dir_size+=dirSize($subFile);
}
if(is_file($subFile)){
$dir_size+=filesize($subFile);
}
}
}
}
closedir($dir_handle);
return $dir_size;
}
}
$dir_size = dirSize('phpMyadmin');
echo round($dir_size/pow(1024,1),2).'kb';
?>
也可以使用exec()或system()函数调用操作系统命令du来返回目录的大小,但出于安全原因,这样函数通常是禁用的,而且也不利于跨平台操作。

3、建立和删除目录

在php中,使用mkdir()函数只需要传入一个目录名即可很容易的建立一个新目录,但删除目录需要函数rmdir(),只能删除空目录并且目录必须存在,如果是非空目录就需要先进入目录,使用unlink()函数将目录中的每个文件都删除掉,再回来将这个空目录删除,如果目录中还存在子目录,而且子目录也非空,就是使用递归的方法了。

<?php
function delDir($directory){
if(file_exists($directory)){
if($dir_handle=@opendir($directory)){
while($filename=readdir($dir_handle)){
if($filename!='.'&&$filename!='..'){
$subFile = $directory.'/'.$filename;
if(is_dir($subFile)){
delDir($subFile);
}
if(is_file($subFile)){
unlink($subFile);
}
}
}
}
closedir($dir_handle);
rmdir($directory);
}
delDir("phpMyadmin");
}
?>
当然也可以通过操作系统命令rm -rf删除非空目录,但也要从安全和跨平台的方面考虑尽量不要使用。

4、复制或移动目录

虽然复制或移动一个目录,是文件操作系统的基本功能,但PHP中也没有给出特定的函数,同样需要自定义一个递归函数实现,要复制一个包含多级子目录的目录,将涉及文件的复制,目录创建等操作,复制一个文件可以通过copy()函数完成,创建目录可以使用mkdir(),定义函数时候,首先对源目录进行遍历,如果遇到的是普通文件,直接使用copy()函数进行复制,如果遍历时遇到一个目录,则必须建立该目录,然后再对该目录下的文件进行复制操作,如果还有子目录,则使用递归重复操作,最终将整个目录复制完成。如果是移动目录,只需在遍历时将复制后的文件或目录删除即可,自定义的递归函数复制目录的程序代码如下
<?php
function copyDir($dirSrc,$dirTo){
if(is_file($dirTo)){
echo "目标不是目录不能创建!!";
return;
}
if(!file_exists($dirTo)){
mkdir($dirTo);
}
if($dir_handle=@opendir($dirSrc)){
while($filename=readdir($dir_handle)){
if($filename!='.'&&$filename!='..'){
$subFile = $dirSrc.'/'.$filename;
$subTofile=$dirTo."/".$filename;
if(is_dir($subFile)){
copyDir($subFile,$subToFile);
}
if(is_file($subFile)){
copy($subFile,$subToFile);
}
}
}
closedir($dir_handle);
}
}
copyDir("phpMyadmin","D:/admin");
?>
也要从安全和跨平台等方面考虑,尽量也不要去调用操作系统的shell命令,"cp -a" 或 "mv"完成目录的复制或移动

上一篇:PHP目录的基本操作basename()、dirname()、pathinfo()
下一篇:PHP文件的打开与关闭fopen()、fclose()