PHP文件相关的操作函数——目录操作
1.有关文件类型的函数
PHP是以UNIX的文件系统为模型的,因此在Windows系统中我们只能获得“file”、“dir”或者“unknown”三种文件类型。而在UNIX系统中,我们可以获得“block”、“char”、“dir”、“fifo”、“file”、“link”和“unknown”7种类型。
1.1 filetype()
作用:获取文件的上传类型
语法:filetype(filename)
参数:该函数接受一个文件名作为参数,如果文件不存在将返回FALSE。
代码示例:
echo filetype("C:\Users\lenovo\Desktop"); //输出:dir
echo filetype("C:\Users\lenovo\Desktop/test.txt"); //输出:file
1.2 is_file():判断给定的文件名是否为一个正常的文件。如果是返回true,否则返回false
is_dir():判定给定的文件名是否是一个目录,返回结果同上
is_link():判定给定的文件名是否为一个符号链接,返回结果同上。
2.与文件属性相关的函数
2.1 file_exists()
作用:检查文件或目录是否存在
参数:文件名
返回值:文件存在返回TRUE,不存在返回FALSE
2.2 filesize()
作用:获得文件大小
参数:文件名
返回值:返回文件大小的字节数,出错返回FALSE
2.3 is_readable()
作用:判定给定文件名是否可读
参数:文件名
返回值:如果文件存在且可读则返回TRUE
2.4 is_writable()
作用:判断给定文件名是否可写
参数:文件名
返回值:如果文件存在且可写则返回TRUE
2.5 is_executable()
作用:判断给定文件名是否可执行
参数:文件名
返回值:如果文件存在且可执行则返回TRUE
2.6 filectime()
作用:获取文件的创建时间
参数:文件名
返回值:返回UNIX时间戳格式
2.7 filemtime()
作用:获取文件的修改时间
参数:文件名
返回值:返回UNIX时间戳格式
2.8 fileatime()
作用:获取文件的访问时间
参数:文件名
返回值:返回UNIX时间戳格式
2.9 stat()
作用:获取文件大部分属性值
参数:文件名
返回值:返回关于给定文件有用信息的数组
2.10 clearstatcache()
以上函数都需要提供同样的字符串参数,即一个指向文件或目录的字符串型变量。PHP将缓存这些函数的返回信息已提供更快的性能。然而在某些情况下,你可能想清除被缓存的信息。例如,如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,需要清除文件状态缓存。可以用该函数来清除PHP缓存的该文件信息。clearstatcache()函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作,并且需要该文件信息不被缓存时才需要调用它。
2.11 lstat():功能和stat()函数相同,只是该函数只能作用于一个符号链接,而不是普通的文件
2.12 fstat():功能和stat()函数相同,只是该函数需要一个资源句柄。
3.与文件目录操作有关的函数
3.1 解析目录路径
将目录路径中各个属性分离开通常很有用,如末尾的扩展名、目录部分和基本名。
3.1.1 basename()
作用:返回路径中的的文件部分
语法:string basename(string path[,string suffix])
参数:该函数给出一个包含有指向一个文件的全路径的字符串,第二个参数是可选参数,规定文件的扩展名。如果提供了则不会输出这个扩展名。
返回值:本函数返回基本的文件名
示例代码:
$path = "C:\Users\lenovo\Desktop/test.txt";
echo basename($path); //输出:test.txt
echo basename($path,".txt"); //输出:test
3.1.2 dirname()
作用:返回去掉文件名的目录名
语法:striing dirname(string path)
参数:该函数只有一个参数,给出一个包含有指向一个文件的全路径的字符串
返回值:返回去掉文件名后的目录名
示例代码:
$path = "C:\Users\lenovo\Desktop/test.txt";
echo dirname($path); //输出:C:\Users\lenovo\Desktop
3.1.3 pathinfo()
作用:返回路径信息
语法:pathinfo(path,options)
返回值:返回一个关联数组,其中包括指定路径中的目录名、基本名和扩展名三个部分,分别通过数组键dirname、basename和extension来引用。
示例代码:
$path = "C:\Users\lenovo\Desktop/test.txt";
var_dump(pathinfo($path));
//输出:array
'dirname' => string 'C:\Users\lenovo\Desktop' (length=23)
'basename' => string 'test.txt' (length=8) '
extension' => string 'txt' (length=3) 'filename' => string 'test' (length=4)
3.2 遍历目录
取得一个目录下的文件和子目录,就需要用到opendir()函数、readdir()函数、closedir()函数和rewinddir()函数
3.2.1 opendir():用于打开指定目录,接受一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄(资源类型)。如果该目录不存在或者没有访问权限,则返回FALSE
3.2.2 readdir():用于读取指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位。当指针位于目录的结尾时,因为没有文件存在则返回FALSE。
3.2.3 closedir():关闭指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数。函数无返回值,运行后将关闭打开的目录。
3.2.4 rewinddir():倒回目录句柄,接受已经用opendir()函数打开的可操作目录句柄作为参数。将目录指针重置目录到开始处,即倒回目录的开头。
示例代码:
$dirname = 'C:\Users\lenovo\Desktop';
$dir_handle = opendir($dirname);
while($file = readdir($dir_handle))
{
$dirFile = $dirname."/".$file;
echo $file." ".filesize($dirFile)." ".filetype($dirFile);
echo "<br>";
}
closedir($dir_handle);
3.3 统计目录大小
PHP目前没有提供目录总大小的标准函数,因此我们要自定义一个函数来完成这个任务。首先要考虑计算的目录中有没有包含其他子目录的情况,如果没有子目录,目录下的所有文件的大小相加后的总和就是这个目录的大小。如果包含子目录,就按照这个方法再计算一下子目录的大小。使用递归函数最适合此项任务。代码详见P351
3.4 建立和删除目录
3.4.1 mkdir()
该函数用于建立一个新目录,详情访问:http://www.w3school.com.cn/php/func_filesystem_mkdir.asp
3.4.2 rmdir()
该函数只能删除一个空目录并且目录必须存在。如果是非空的目录就需要先进入到目录中,使用unlink()函数将目录中的每个文件都删除掉,再回来将这个空目录删除。如果目录中还存在子目录,而且子目录也非空,就要使用递归的方法了。详细代码见P352
3.5 复制目录
虽然复制一个目录是文件操作的基本功能。但PHP中也没有给出特定的函数,同样需要自定义一个递归函数实现。要复制一个包含多级子目录的目录,将涉及文件的复制、目录创建等操作,复制一个文件可以通过PHP提供的copy()函数完成,创建目录可以使用mkdir()函数。定义函数时,首先对源目录进行遍历,如果遇到的是普通文件,直接使用copy()函数进行复制。如果遍历是遇到一个目录,则必须建立该目录,然后再对该目录下的文件进行复制操作,如果还有子目录,则使用递归重复操作,最终将整个目录复制完成、自定义的递归函数复制目录代码见P352