一、文件系统概述

1、文件类型

UNIX系统中7中文件类型说明


 文件类型                               描述
Block块设备文件,如某个磁盘分区,软驱,光驱CD-ROW等
Char字符设备是指在I/O传输过程中以字符为单位进行传输的设备,例如键盘、打印机等
Dir目录类型,目录也是文件的一种
Fifo命名管道,常用于将信息从一个进程传输到另一个进程
File普通文本类型,如文本文件或可执行文件等
Link符号链接,是指向文件指针的指针,类似windows中的快捷方式
Unknown未知类型

    在PHP中,可以通过filetype()函数获取文件的上述类型,该函数接受一个文件名作为参数。

    对于一个已知的文件,可以使用is_file()函数判断给定的文件名是否为一个正常的文件;使用is_dir()函数判断给定的文件名是否是一个目录;使用is_link()函数判断给定的文件名是否为一个符号链接。

2、文件属性

PHP的文件属性处理函数


   函数名      作用 参数返回值
file_exists()检查文件或目录是否存在文件名存在返回TRUE
filesize()取得文件大小文件名返回文件大小的字节数
file_readable()判断给定文件名是否可读文件名TRUE 或者FALSE
file_writable()判断给定文件名是否可写文件名TRUE 或者FALSE
file_executable()判断给定文件名是否可执行文件名TRUE 或者FALSE
filectime()取得文件的创建时间文件名返回UNIX时间戳格式
filemtime()取得文件的修改时间文件名返回UNIX时间戳格式
fileatime()取得文件的访问时间文件名返回UNIX时间戳格式
stat()获取文件大部分属性值文件名返回关于给定文件有用信息的数组


<?php

// /**

// 声明一个函数,通过传入一个文件名称获取文件大部分属性

// */

function filetyp($filename){

//如果提供的文件或目录不存在,则直接退出函数

if(!file_exists($filename)){

echo "目标文件不存在!!!"."<br/>";

return;

}


//判断是否是一个普通文件

if(is_file($filename)){

echo $filename."是一个文件"."<br/>";

}


//判断是否是一个目录

if(is_dir($filename)){

echo $filename."是一个目录"."<br/>";

}


//用定义的函数输出文件形态

echo "文件形态:".filetype($filename)."<br/>";

//获取文件大小,并自定义转换单位

echo "文件大小".filesize($filename)."<br/>";


if(is_readable($filename)){

echo "该文件可读"."<br/>";

}


if(is_writable($filename)){

echo "该文件可写"."<br/>";

}


if(is_executable($filename)){

echo "该文件可执行"."<br/>";

}


echo "文件建立时间:".date("Y年m月d日",filectime($filename))."<br/>";

echo "文件修改时间:".date("Y年m月d日",filemtime($filename))."<br/>";

echo "文件访问时间:".date("Y年m月d日",fileatime($filename))."<br/>";

}


/**

声明一个函数,用来返回文件的类型

*/

function gfiletype($fileName){

switch(filetype($fileName)){

case "file":      $type."=普通文件";   break;

case "dir":       $type."=目录文件";    break;

case "block":     $type."=块设备文件";    break;

case "char":      $type."=字符设备文件";    break;

case "fifo":      $type."=命名管道文件";    break;

case "link":      $type."=符合链接";        break;

case "unknown":   $type."=未知类型";      break;

default:          $type."=没有检测到类型";      break;

}

return $type;

}


/**

自定义一个文件大小单位转换函数

*/

function gfilesize($bytes){

if($bytes>=pow(2,40)){

$return=round($bytes/pow(1024,4),2);

$suffix="TB";

}

elseif($bytes>=pow(2,30)){

$return=round($bytes/pow(1024,3),2);

$suffix="GB";

}

elseif($bytes>=pow(2,20)){

$return=round($bytes/pow(1024,2),2);

$suffix="MB";

}

elseif($bytes>=pow(2,10)){

$return=round($bytes/pow(1024,1),2);

$suffix="KB";

}

else{

$return=$bytes;

$suffix="byte";

}

return $return." ".$suffix;

}


//调用自定义函数,将当前目录下的t2.php文件传入,获取属性

filetyp("t2.php");

?>

代码运行结果为:

wKioL1glZ3Pixyz1AAAhF6Xaoyw432.png-wh_50






二、目录的基本操作

1、解析目录路径

   在系统的每个目录下,都有两个特殊的目录“.”和“..”,分别指示当前目录和当前目录的父目录(上一级目录)。

2、遍历目录

   即浏览某个目录下面的文件。

(1)函数operdir()用于打开指定目录,接受一个目录的路径及目录名作为参数。

(2)函数readdir()用于读取指定目录,接受已经用operdir()函数打开的可操作目录句柄作为参数。

(3)函数closedir()用于关闭指定目录,接受已经用operdir()函数打开的可操作目录句柄作为参数。

(4)函数rewinddir()倒回目录句柄,接受已经用operdir()函数打开的可操作目录句柄作为参数。

   

   下面用一个实例来说明以上几个函数的使用方法。注意,在使用该例子前请确保同一目录下有phpMyAdmin文件夹。

<?php

$num=0;

$dirname="phpMyAdmin";             //dirname可用其他字母代替

$dir_handle=opendir($dirname);     //dir_handle可用其他字母代替


//将遍历的目录和文件名使用表格格式输出

echo "<table text-align='center' width='600' cellspacing='0' cellpading='0'>";

echo "<caption><h2>目录".$dirname."下面的内容</h2></caption>";

echo "<tr text-align='left' bgcolor='#ffffff'>";

echo "<th>文件名</th><th>文件大小</th><th>文件类型</th><th>修改时间</th>";

echo "</tr>";


//使用readdir循环读取目录里的内容

while($file=readdir($dir_handle)){      //file可用其他字母代替

//将目录下的文件和当前目录链接起来,才能在程序中使用

$dirfile=$dirname."/".$file;        //dirfile可用其他字母代替


$bgcolor=$num++%2==0 ? "#ffffff" :"#cccccc";

echo "<tr bgcolor='.$bgcolor.'>";

echo '<td>'.$file.'</td>';

echo '<td>'.filesize($dirfile).'</td>';

echo '<td>'.filetype($dirfile).'</td>';

echo '<td>'.date('Y/m/d',filemtime($dirfile)).'</td>';

echo "</tr>";

}


echo "</table>";


closedir($dir_handle);


echo "在<b>".$dirname."</b>目录下的子目录和文件共有".$num. "个";

?>

程序运行结果如下所示:

wKioL1gpV7fQwZ-kAAJxrB0Hy14485.png-wh_50













































3、统计目录大小

   用filesize()函数计算文件大小,用disk_free_space()和disk_total_space()两个函数统计磁盘大小。

<?php

/**

自定义一个函数dirsize()统计传入参数的目录大小

@param string $directory    目录名称

@return double              目录的尺寸大小

*/

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";      //字节数转换为KB单位

?>

4、建立和删除目录

   在PHP中,使用mkdir()函数只需要传入一个目录名就可以很容易地建立一个新目录。但删除目录所用的函数rmdir()只能删除一个空目录并且目录必须存在。如果是非空的目录就需要先进入到目录中,使用unlink()函数将目录中的每个文件都删掉,再回来将这个空目录删除。如果目录中还存在子目录,而且子目录也非空,就要使用递归的方法了。自定义递归函数删除目录的代码程序如下所示:

<?php

/**

自定义函数递归地删除整个目录

@param   string   $directory       目录名称 

*/

function deldir($directory){

if(file_exists($directory)){              //如果不存在rmdir()函数会出错

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

?>

5、复制目录