PHP文件系统处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP文件系统处理相关的知识,希望对你有一定的参考价值。
文件系统概述
文件类型
php是以UNIX的文件系统为模型的,因此Windows系统中我们只能获得"file"、"dir"或者"unknown"三种文件类型。而UNIX系统中,可以获得"block"、"char"、"dir"、"fifo"、"file"、"link"和"unknown"7种类型。
使用filetype()函数获取文件的上述类型,该函数接受一个文件名作为参数,如果文件不存在将返回false。
is_file()判断给定的文件名是否为一个正常的文件。
is_dir()判断给定的文件名是否是一个目录。
is_link()判断给定的文件名是否是一个符号链接。
文件的属性
PHP的文件属性处理函数
clearstatcache()函数清除被PHP缓存的文件信息。对同一个文件名进行多次操作,并且需要该文件信息不被缓存时才需要调用它。
目录的基本操作
解析目录路径
UNIX系统中必须使用正斜线"/"作为路径分隔符,而windows系统中默认使用反斜线"\"作为路径分隔符,在程序中表示时还要将"\"转义,但也接受正斜线"/"作为分隔符的写法。建议使用正斜线"/"作为路径分隔符。
PHP内置常量DIRECTORY_SEPARATOR,其值为当前操作系统的默认文件路径分隔符。
basename()
返回路径中文件名部分。
1
2
3
4
5
|
<?php $path = "D:/amp/php/php.ini" ; echo basename ( $path ). "<br/>" ; //php.ini echo basename ( $path , ".ini" ). "<br/>" ; //php echo basename ( $path , ".php" ); //php.ini |
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
1
2
3
|
<?php $path = "D:/amp/php/php.ini" ; echo dirname( $path ). "<br/>" ; // D:/amp/php |
返回一个关联数组,其中包括指定路径中的目录名、基本名、扩展名三部分。分别通过dirname、basename、extension来引用。
1
2
3
4
5
6
|
<?php $path = "D:/amp/php/php.ini" ; $path_parts = pathinfo ( $path ); echo $path_parts [ ‘dirname‘ ]. "<br/>" ; //D:/amp/php echo $path_parts [ ‘basename‘ ]. "<br/>" ; //php.ini echo $path_parts [ ‘extension‘ ]. "<br/>" ; //i |
遍历目录
opendir()
用于打开指定目录,接受一个目录及目录名作为参数,函数返回值可供其他目录函数使用的目录句柄(资源类型)。如果该目录不存在或者没有访问权限,则返回false。
readdir()
读取指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位。当指针位于目录的结尾时,因为没有文件存在则返回false。
closedir()
关闭指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数。函数无返回值,运行后将关闭打开的目录。
rewinddir()
倒回目录句柄,接受已经用opendir()函数打开的可操作目录句柄作为参数。将目录指针重置到目录开始处,即倒回目录的开头。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php date_default_timezone_set( "PRC" ); $num = 0; //用来统计子目录和文件的个数 $dirname = ‘d:/amp/php‘ ; //保存当前目录下用来遍历的一个目录名 $dir_handle = opendir( $dirname ); //用opendir打开目录 //将遍历的目录和文件名使用表格格式输出 echo ‘<table border="0" align="center" width="600" cellspacing="0" cellpadding="0">‘ ; echo ‘<caption><h2>目录‘ . $dirname . ‘下面的内容</h2></caption>‘ ; echo ‘<tr align="left" bgcolor="#cccccc">‘ ; echo ‘<th>文件名</th><th>文件大小</th><th>文件类型</th><th>修改时间</th></tr>‘ ; //使用readdir循环读取目录里的内容 while ( $file = readdir( $dir_handle )) { //将目录下的文件和当前目录连接起来,才能在程序中使用 $dirFile = $dirname . "/" . $file ; $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/n/t" , filemtime ( $dirFile )). ‘</td>‘ ; //格式化显示文件修改时间 echo ‘</tr>‘ ; } echo ‘</table>‘ ; //关闭表格标记 closedir ( $dir_handle ); //关闭文件操作句柄 echo ‘在<b>‘ . $dirname . ‘</b>目录下的子目录和文件共有<b>‘ . $num . ‘</b>个‘ ; |
统计目录大小
disk_free_space()计算磁盘空闲容量大小。
disk_total_apace()计算磁盘大小。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?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( "d:/amp/php" ); //调用该函数计算目录大小 echo round ( $dir_size /pow(1024,1),2). "KB" ; //字节数转换为“KB”单位并输出 |
建立和删除目录
mkdir()创建一个新目录。rmdir()删除目录,只能删除一个空目录并且目录必须存在,如果是非空目录就需要先进入到目录中,使用unlink()函数将目录中的每个文件都删除掉,再回来将这个空目录删除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?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" ); //调用delDir()函数,将程序所在目录中的“phpMyAdmin”文件夹删除 |
复制目录
首先对源目录进行遍历,如果遇到的是普通文件,直接使用copy进行赋值;如果遍历时遇到一个目录,则必须建立该目录,然后再对该目录下的文件进行复制操作,如果还有子目录,则使用递归重复操作,最终将整个目录复制完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php /** 自定义函数递归的复制带有多级子目录的目录 @param string $dirSrc 原目录名称字符串 @param string $dirTo 目标目录名称字符串 */ 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 != ".." ) { //一定要排除两个特殊的目录 $subSrcFile = $dirSrc . "/" . $filename ; //将源目录的多级子目录连接 $subToFile = $dirTo . "/" . $filename ; //将目标目录的多级子目录连接 if ( is_dir ( $subSrcFile )) //如果源文件是一个目录 copyDir( $subSrcFile , $subToFile ); //递归调用自己复制子目录 if ( is_file ( $subSrcFile )) //如果源文件是一个普通文件 copy ( $subSrcFile , $subToFile ); //直接复制到目标位置 } } closedir ( $dir_handle ); //关闭目录资源 } } //测试函数,将目录"phpMyAdmin"复制到"D:/admin" copyDir( "phpMyAdmin" , "D:/admin" ); |