8.2 文件处理
在任何计算机设备中,文件都是必需的对象。在Web编程中,文件的操作也一直是让Web程序员头疼的,而文件的操作在一些特定的Web系统中也是必需的。PHP提供了丰富的文件和目录读写功能以及文件上传功能,可以快速便捷地满足应用的需要。
8.2.1 文件的打开与关闭
有关文件的操作,最基本的就是读写文件。下面就分别介绍对文件的打开与关闭操作。
1.文件的打开
PHP提供fopen()函数用来打开本地或远程文件,打开文件的方式有只读方式、写入方式和读写方式等。函数语法:
resource fopen (string filename, string mode [, bool use_include_path [, resource zcontext]])
(1)参数$filename就是要打开的文件的文件名。
(2)参数$mode为打开模式,可选参数有r、r+、w、w+、a、a+、x、x+等8个,分别代表只读、写入等不同的打开方式。具体打开模式参见表8-2。
打开模式 | 描述 |
r | 以只读方式打开,将文件指针指向文件头 |
r+ | 以读写方式打开,将文件指针指向文件头 |
w | 以写入方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建它 |
w+ | 以读写入方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建它 |
x | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它 |
x+ | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建它 |
(3)参数use_ include_ path,可选。如果也需要在use_include_ path中检索文件,可以将该参数设为1或true。
(4)参数zcontext,可选。规定文件句柄的环境。zcontext是可以修改流的行为的一套选项。
以下语句通过fopen()函数以只读方式打开文件test.txt。
$file = fopen("test.txt","r");
2.文件的关闭
打开一个文件,完成读写操作后,需记得及时关闭这个文件。PHP提供关闭文件功能的函数是fclose()。函数语法:
bool fclose(resource $handle)
(1)参数file是一个文件指针。fclose()函数关闭该指针指向的文件。
(2)如果函数执行成功则返回true,否则返回false。文件指针必须有效,并且是通过fopen()或fsockopen()成功打开的。
8.2.2 文件的访问
1.读取文件
最常用的读取文件内容函数是fread(),函数语法为:
fread(file,length)
(1)参数file必需。规定要读取打开的文件。
(2)参数length必需。规定要读取的最大字节数。
(3)返回所读取的字符串,如果出错返回false。
8-20.php完成以只读方式打开文件test.txt,并输出该文件内容,最后关闭该文件。
8-20.php
<?php $file = fopen("test.txt","r"); echo fread($file,filesize("test.txt")); fclose($file); ?>
运行效果如图8-20所示。
2.写入文件
最常用的写入文件的函数是fwrite (),函数语法:
fwrite(file,string,length)
(1)参数file必需。规定要写入的打开文件。
(2)参数string必需。规定要写入文件的字符串。
(3)参数length可选。规定要写入的最大字节数。
(4)fwrite()把string的内容写入文件指针file处。如果指定了length,当写入了length个字节或者写完了string以后,写入就会停止,看先碰到哪种情况。
(5)fwrite()返回写入的字符数,出现错误时则返回false。
下面的例子完成以写入方式打开文件test.txt,并将“Hello World. Testing!”写入该文件,输出写入文件字符数,最后关闭该文件。
8-21.php
<?php $file = fopen("test.txt","w"); echo fwrite($file,"Hello World. Testing!"); fclose($file); ?>
运行效果如图8-21所示。
8.2.3 目录的处理
目录操作在程序开发中也是必需的,PHP提供了目录操作的相关函数。以下介绍目录相关操作的函数。
1.判断指定目录是否存在
PHP通过is_dir()函数判断指定目录是否存在。函数用法如下。
is_dir(file)
(1)参数file必需。规定要检查的文件。
(2)如果文件名存在并且为目录,则返回true。如果file是一个相对路径,则按照当前工作目录检查其相对路径。
示例8-22.php完成判断book是否是一个目录,如果是一个目录则输出“book is a directory”,否则输出“dir is not a directory”。
8-22.php
<?php $dir = "book"; if(is_dir($dir)) { echo "$dir is a directory"; } else { echo "$dir is not a directory"; } ?>
运行效果如图8-22所示。
2.创建目录
在程序编写时有时需要创建目录,PHP提供了mkdir()函数,函数用法如下。
mkdir(path,mode,recursive,context)
(1)path必需。规定要创建的目录的名称。
(2)mode必需。规定权限。默认是0777。
(3)recursive必需。规定是否设置递归模式。
(4)context必需。规定文件句柄的环境。context是可修改流的行为的一套选项。
(5)mkdir()尝试新建一个由path指定的目录。默认的mode是0777,意味着最大可能的访问权。
8-23.php完成创建目录testing。
8-23.php
<?php echo "mkdir('testing')运行返回:"; var_dump(mkdir("testing")); ?>
运行效果如图8-23所示。
3.删除目录
PHP提供函数rmdir()完成目录删除操作,函数语法如下。
rmdir(dir,context)
(1)dir必需。规定要删除的目录。
(2)context规定文件句柄的环境。context是可修改流的行为的一套选项。
(3)函数若执行成功,则该函数返回true。若失败,则返回false。尝试删除dir所指定的目录。该目录必须是空的,而且要有相应的权限。
8-24.php
<?php $path = "testing"; if(!rmdir($path)) { echo ("Could not remove $path"); } else { echo (" remove $path"); }
运行效果如图8-24所示。
4.显示指定目录信息
PHP使用pathinfo()函数返回文件路径的信息。pathinfo()函数用法如下。
pathinfo(path,Process_sections)
(1)path必需。规定要检查的路径。
(2)Process_sections可选。规定要返回的数组元素。默认是all。process_sections可取下列值。
① PATHINFO_DIRNAME:只返回dirname。
② PATHINFO_BASENAME:只返回basename。
③ PATHINFO_EXTENSION:只返回extension。
(3)pathinfo()函数以数组的形式返回文件路径的信息。
8-25.php可以返回文件test.txt所在目录的信息。
8-25.php
<?php print_r(pathinfo("test.txt")); ?>
运行效果如图8-25所示。
8.2.4 文件上传与下载
在编写程序时,有时还需完成文件的上传及下载功能。下面来学习如何实现文件的上传与下载。
1.文件上传
要想上传本地文件到服务器,必须使用表单的POST方法,GET方法是不能实现此功能的,同时,表单的enctype属性必须设置为“multipart/form-data”。下面来看一个文件上传的例子。
8-26.php
<html> <body> <form action="upload_file.php" method="post" enctype="multipart/ form- data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
upload_file.php代码如下。
<?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: ".($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; }
运行效果如图8-26~图8-28所示。
2.文件下载
文件下载有两种方法,第一种非常简单,通过超链接实现,比如:
<a href="a.rar">下载a.rar</a>
该方法只能下载浏览器不能解析的文件,比如rar或脚本文件之类。如果文件是图片或者txt文档,就会直接在浏览器中打开。
第二种方式是代码。
8.27.php
<html> <body> <form action="download.php" method="post" enctype="multipart/form-data"> <input type="submit" name="submit" value="dowmload" /> </form>
download.php代码如下:
</body> </html> <?php $file=fopen('test.txt',"r"); header("Content-Type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Accept-Length: ".filesize('test.txt')); header("Content-Disposition: attachment; filename='test.txt'"); echo fread($file,filesize('test.txt')); fclose($file); ?>
运行结果如图8-29所示。
单击download按钮后弹出下载文件窗口,选择保存下载文件目录后,单击“下载”按钮,如图8-30所示。