15.1 文件系统概述
15.1.1 文件类型
15.1.2 文件的属性
15.2 目录的基本操作
15.2.1 解析目录路径
要描述一个文件的位置,可以使用绝对路径和相对路径。UNIX中必须使用“/”作为路径分隔符,而在Windows中默认使用“\”作为路径分隔符,在程序中标识时还要将“\”转义。建议是有“/”作为文件路径分隔符。
1. 函数basename()
函数返回路径中文件名部分。
string basename (string path[,string suffix])
<?php
$path="/var/www/html/page.php";
echo basename($path);
echo basename($path,".php");
?>
2. 函数dirname()
该函数恰好与basename相反,只需要给出一个参数,函数返回去掉文件名后的目录名。
3. 函数pathinfo()
15.2.2 遍历目录
取得一个目录下的文件和子目录,就需要用到opendir()函数、reddir()函数、closedir()函数和rewinddir()函数。
函数opendir()用于打开指定的目录,接受一个目录的路径及目录名作为参数
函数readdir()用于读取指定的目录,接受已经用opendir()函数打开的可操作目录句柄作为参数
函数closedir()关闭指定目录
函数rewinddir()倒回目录句柄
15.2.3 统计目录大小
<?php
//自定义一个函数dirSize(),统计传入参数的目录大小
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”单位并输出
?>
15.2.4 建立和删除目录
15.2.5 复制目录
要复制一个包含多级子目录的目录,将涉及文件的复制、目录创建等操作,复制一个文件可以通过PHP提供的copy()函数完成,创建目录可以使用mkdir()函数。
<?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!=".."){
$subSrcFile=$dirSrc."/".$filename;
$subToFile=$dirTo."/".$filename;
if(is_dir($subSrcFile)) {
copyDir($subSrcFile, $subToFile);
}
if(is_file($subSrcFile)){
copy($subSrcFile,$subToFile);
}
}
}
closedir($dir_handle);
}
}
?>
15.3 文件的基本操作
15.3.1 文件的打开与关闭
1. 函数fopen()
resource fopen(string filename,string mode[,bool use_include_path[,resource zcontext]])
第一个参数需要提供被打开文件的URL,第二个参数需要提供文件模式,文件模式可以告诉操作系统如何处理来自其他人或脚本的访问请求,以及一种用来检查你是否有权访问这个特定文件的方法:
打开一个文件为只读、只写或者是读写
如果要写一个文件,可以覆盖所有已有的文件内容,或者需要将新数据追加到文件末尾
如果在一个区分二进制文件和纯文本文件的系统上写一个文件,还必须指定采用的方式
2. 函数fclose()
资源类型PHP的基本类型之一,一旦完成资源的处理,一定要将其关闭,否则可能会出现一些预料不到的错误。参数必须是使用fopen()或fsockopen()函数打开的已存的文件指针。
15.3.2 写入文件
int fwrite(resource handle,string string[,int length])
第一个参数需要提供fopen()函数打开的文件资源,该函数将第二个参数提供的字符串内容输出到由第一个参数指定的资源中。如果给出了第三个参数,则fwrite()将在写入了length个字符时停止,否则将一直写入。
15.3.3 读取文件内容
1. 函数fread()
该函数用来在打开的文件中读取指定长度的字符串。
string fread(int handle,int length)
2. 函数fgets()、fgetc()
string fgets(int handle[,int length])
3. 函数file()
该函数非常有用,与file_get_contents()类似,不需要使用fopen()函数打开文件,不同的是file()函数可以把整个文件读入到一个数组中。
4. 函数readfile()
该函数可以读取指定的整个文件,立即输出到输出缓冲区,并返回读取的字节数。
15.3.4 访问远程文件
15.3.5 移动文件指针
可以通过ftell()、fseek()、rewind()三个函数对文件指针进行操作。
int ftell(resource handle) //返回文件指针当前位置
int fseek(resource handle,int offset[,int whence]) //移动文件指针到指定位置
bool rewind(resource handle) //移动文件指针到文件的开头
使用这些函数时,必须提供一个用fopen()函数打开的、合法的文件指针。
15.3.6 文件的锁定机制
在PHP中提供了flock()函数,可以对文件使用锁定机制。当一个进程在访问文件时加上锁,其他进程要想访问,则必须等到锁定被释放以后。
bool flock(int handle,int operation[,int &wouldblock])
第一个参数handle必须是一个已经打开的文件资源,第二个参数operation也是必需的,规定使用哪个锁定类型。
15.3.7 文件的一些基本操作函数
15.4 文件的上传和下载
15.4.1 文件上传
1. 客户端上传设置
文件上传的最基本方法,是使用HTML表单选择本地文件进行提交,在form表单中可以通过<input type="file">
标记选择本地文件。如果支持文件上传操作,必须在<form>
标签中将enctype和method两个属性指明相应的值。
<html>
<head><title>文件上传</title></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">选择文件:<input type="file" name="myfile">
<input type="submit" value="上传文件">
</body>
</html>
2. 在服务端通过PHP处理上传
bool is_upload_file(string filename)
bool move_upload_file(string filename,string destination)
15.4.2 处理多个文件上传
15.4.3 文件下载
简单的文件下载只需要使用HTML的链接标记<a>
,并将属性href的URL值指定为下载的文件即可。
<a href="http://XXXXX.rar">下载文件</a>
为了提高文件安全性,不希望在<a>
标签中给出文件的链接,则必须向浏览器发送必要的头文件,以通知浏览器将要进行下载文件的处理。
header('Content-Type:image/gif'); //发送指定文件MIME类型的头信息
header('Content-Type:attachment;filename="test.gif"'); //发送描述文件的头信息,附件和文件名
header('Content-Length:3390'); //发送指定文件大小的信息,单位字节