主要内容:
(1)文件的打开、读取、写入、删除、拷贝等操作。
(2)目录的访问、创建和删除等操作。
(3)判断文件是否存在,是否可读。
一、访问文件
1、打开文件
打开文件使用fopen()函数,fopen函数可以指定打开文件的模式,可以设置打开的文件为只读、只写和可读写状态。函数原型:fopen(文件,打开模式)。
2、读取文件
(1)使用fread函数来读取文件内容,函数的声明为:string fread(int handle ,int length)。函数从handle指针处读取length长度的内容,如果读取成功则返回读取的指定长度的字符串,如果失败则返回FALSE.
注意:使用函数fread读取一个文件后,文件指针会进行相应的移动,如果想要重新读取文件内容,需要先fclose关闭文件然后再次使用fopen打开文件。要读取文件的所有内容,可以使用函数filesize来获取指定文件所占用的字节数,filesize函数的参数是文件名而不是打开的文件指针。如下:
<?php /* * Created on 2013-8-10 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ $filename = 'file_upload.php'; $handle = fopen($filename,'r'); $str =fread($handle,filesize($filename)); echo $str.'<br />'; fclose($handle); ?>
当使用完文件后,需要关闭文件句柄来释放资源,可以使用fclose()函数。函数原型:fclose($handle),其中$handle就是文件打开的句柄文件。如果文件关闭成功,则返回TRUE。若关闭失败,则返回FALSE。
(2)如果要读取文件一行的内容,可以使用函数fgets()来实现,函数的声明如下:
string fgets(int handle [,int length])
函数fgets()从指针handle处读取一行数据,参数length用于限制读取的最大长度,即返回长度length-1个字节的数据,如果没有指定参数length,则默认返回1024个字节的数据。当然,如果该行数据没有达到length长度限制,则会返回整行完整数据。
一般使用函数feof()来测试文件指针是否到达文件结束的位置,如果文件指针到了文件结束位置EOF或者出错时,返回TRUE,否则返回FALSE。注意,如果函数feof的参数即文件句柄无效或者不存在,则函数仍会返回FALSE,从而使用feof循环读取文件的内容出现死循环。
(3)读取文件的一个字符,使用函数fgetc()来实现,函数原型如下:
string fgetc(resource handle)
函数fgetc()可以读取文件中的一个字符,因此可以用于逐个字符读取文件。可以使用flase !==($char = fgetc($fp))来判断文件是否读完,也可以使用feof()来判断文件是否读完。
(4) 一次性读取整个文件内容,使用file()函数。函数的参数是文件名。
注意:file()函数读取的每一行数据中换行符也包含在内,实际使用过程中需要做相应的处理。
(5)如果读取的文件是HTML格式,并且只需要获取非HTML标记的内容,可以使用fgetss()来实现。
(5)readfile()函数:输出一个文件
readfile() 函数输出一个文件。
该函数读入一个文件并写入到输出缓冲。
若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息。
readfile(filename,include_path,context)
参数 | 描述 |
---|---|
filename | 必需。规定要读取的文件。 |
include_path | 可选。如果也想在 include_path 中搜索文件,可以使用该参数并将其设为 true。 |
context | 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。 |
对 context 参数的支持是 PHP 5.0.0 添加的。
ps: readfile()函数一般用于文件下载处,即设置好头部后(header(‘Content-Dispostion:attachment;filename=1.txt’)),就可以调用readfile()将整个文件读取后返回给客户端了。
3、写入文件
(1)fwrite()函数,参数是文件打开后指针。
(2)file_put_contents()函数,参数是文件名。
file_put_contents()函数可以将一个字符串写入文件中。函数不仅可以向本地文件写入,还可以远程写入文件。函数返回值是写入到文件中的字节数。函数功能与依次调用fopen、fwrite、fclose函数一样。
4、复制文件
复制文件使用copy函数,函数原型: bool copy (string source ,string dest)。函数copy会把文件source的内容拷贝到文件dest中,拷贝成功则返回TRUE,反之则返回FALSE。函数的两个参数都是文件名,而不是文件句柄。
如果复制的源文件不存在,则函数执行失败,返回FALSE。如果源文件存在,目标文件不存在,则函数先创建目标文件然后将文件内容从源文件拷贝到目标文件中。
ps:复制一个目录涉及到文件复制、目录建立等操作,需要进行目录遍历和递归。
<?php /* * Created on 2013-8-12 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ $src ="a.txt"; $dst ="b.txt"; if (copy($src,$dst)) { echo '文件复制成功'; } else { echo '文件复制失败'; } ?>
5、删除文件
函数unlink()用于删除文件,函数原型:bool unlink(string filename)。函数unlink也可以删除URL指定的文件。函数执行成功返回TRUE,执行失败返回FALSE。
6、文件重命名
函数rename()可以用于重命名文件和目录,函数的原型为:
bool rename (string oldname ,string newname [,source context])
函数第一个参数表示需要重命名的文件名,第二个参数表示重命名后的文件名。函数执行成功返回TRUE,执行失败返回FALSE。
二、访问目录
上面讲解的是文件操作函数,下面讲解目录操作函数
1、读取目录中的文件
读取目录的步骤和读取文件的步骤差不多,首先获取需要读取目录的句柄,然后遍历目录句柄,然后关闭目录句柄。三个步骤依次用到的函数有:opendir() 、readdir() 、closedir()。
(1)函数opendir()用于打开目录的句柄
函数的原型为:resource opendir (string path [,resource context])。参数path是需要打开的目录路径。如果目录打开成功,则返回目录句柄;如果参数path不是一个合法的目录或者因为权限或文件系统错误而导致不能打开目录,函数opendir将返回FALSE。
(2)函数readdir()用于从目录句柄中读取文件
函数原型是:string readdir(resource dir_handle).参数dir_handle是opendir函数返回的目录句柄。函数readdir将根据目录系统中文件排序返回文件名和子目录名。函数readdir执行一次返回一个文件或目录名,可以使用循环来遍历所有的文件和子目录。注意:readdir返回值中文件和目录是等价的,全是名称字符串,不区分是文件还是目录。
(3)函数closedir()用于关闭目录句柄
函数原型是void closedir(resource dir_handle)。参数dir_name是使用opendir返回的目录句柄。
<?php /* * Created on 2013-8-12 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ $dir ="D:\\"; if ($dir_handle = opendir($dir)) { while ($file =readdir($dir_handle)) { echo $file.'<br />'; } closedir($dir_handle); } else { echo "目录打开失败"; } ?>
2、Directory类实现目录的访问操作
PHP提供了面向对象方式的目录操作方式,使用Directory类。Directory类提供了与opendir、readdir、closedir相对应的成员函数,分别是dir()、read()、close()函数。
Directory类有成员变量path和handle,拥有的成员函数有dir()/read()/rewind()/close()。成员变量path表示被打开的目录路径,handle表示该目录的句柄,dir()是构造函数,read()函数用于读取目录中的文件或子目录,close()函数用于关闭打开的目录句柄。
<?php $d = dir('D://'); echo 'path:'.$d->path.'<br />'; echo 'handle:'.$d->handle.'<br />'; while ($entry = $d->read()) { echo $entry.'<br />'; } $d->close(); ?>
3、创建和删除目录
(1) 使用函数mkdir创建目录,函数的原型如下:
(2)使用函数rmdir来删除目录,函数的原型为:
bool rmdir(string dirname)
函数的参数是待删除的目录名。如果要删除的目标文件目录不为空,则不能使用rmdir来快速删除,需要使用递归的方法来删除目录(即循环递归读取每一个文件或子目录,通过rmdir和unlink来删除)。
三、文件判断操作
除了文件和目录的创建、删除、读写等函数外,PHP还提供了一些控制类函数,如:判断文件或目录是否存在、判断文件是否可读写等。
1、判断文件或目录是否存在
使用函数file_exists来判断文件或目录是否存在,函数的原型如下:
bool file_exists(string filename)
函数file_exists判断文件或目录是否存在,如果存在则返回TRUE,否则返回FALSE.
2、判断文件是否可读写
使用函数is_writable来判断文件或目录是否可写,使用函数is_readable来判断文件或目录是否可读。is_writable函数的别名是:is_writeable,两个等价。
函数的原型: bool is_writable(string filename) .如果参数filename指定的文件可写或目录存在并且可写,则返回TRUE;
函数的原型: bool is_readable(string filename). 如果参数filename指定的文件可读或者目录存在并且可读,则返回TRUE。
四、文件的上传和下载
1、文件上传
文件上传使用input标签的file类型,参考全局变量$_FILES部分。
2、文件下载
文件的下载是指单击一个文件下载链接后,就会弹出文件下载窗口。注意:任何有关从服务器下载的文件操作,必然需要先在服务端将文件读入内存当中,然后将读取的文件发送给客户端。下载文件需要涉及到Header,如下,设置完header之后读取文件发送到客户端即可。
header(“Content-type:text/html;charset=utf-8”)的作用:在服务器响应浏览器的请求时,告诉浏览器以编码格式为UTF-8的编码显示该内容 。
Header(“Content-type: application/octet-stream”)的作用:通过这句代码客户端浏览器就能知道服务端返回的文件形式
Header(“Accept-Ranges: bytes”)的作用:告诉客户端浏览器返回的文件大小是按照字节进行计算的
Header(“Accept-Length:”.$file_size)的作用:告诉浏览器返回的文件大小
Header(“Content-Disposition: attachment; filename=”.$file_name)的作用:告诉浏览器返回的文件的名称。
详细内容参考:http://jinglingshu.org/?p=1686
示例代码:
<?php /* * Created on 2013-8-12 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ //下载文件示例代码 $filename = '测试.txt'; //$filename =$_GET['file']; if (!file_exists($filename)) { echo 'not exist'; } $file_size=filesize($filename); //设置下载时需要用到的头 Header("Content-type:application/octet-stream"); Header('Accept-Ranges:bytes'); Header('Accept-Length:'.$file_size); Header('Content-Disposition:attachment;filename='.$filename); //读取文件向浏览器返回数据,每次读取1024字节 $fp = fopen($filename,'r'); $buffer = 1024; $file_count = 0; //已发送字节数 while(!feof($fp) &&$file_count<$file_size) { $file_content = fread($fp,$buffer); $file_count +=$buffer; echo $file_content; } fclose($fp); ?>
五、其他文件和目录操作
1、文件类型
由于PHP采用UNIX(LINUX)文件系统模型,所以在UNIX(LINUX)文件系统中PHP可以完整的7中类型:file/dir/link/char/block/fifo/unknown,而在windows系统中PHP只能获取到file/dir/unknown三种文件类型。
PHP程序提供函数filetype(string filename)来获取目标文件的类型,函数参数即为文件名。若目标文件不存在,则返回FALSE,否则返回文件类型。
对于一个已知文件可以使用函数is_file()来查看是否其类型是文件,使用函数is_dir()来判断给定的文件名参数是否是一个目录,使用函数is_link()来判断文件是否是一个符号链接类型。这三个函数的返回类型为布尔型。
2、文件属性
文件的属性有:大小、创建时间、修改时间等。在PHP中若想获取指定参数文件名目标文件的基本属性,可以使用stat()和lstat()函数来返回关于文件的信息(返回类型为数组类型)。这两个函数类似,不同的是lstat返回符号连接状态。
使用stat()和lstat()函数可以迅速获取目标的各种基本文件属性。当然可以使用一些单独的PHP内置函数来获取目标文件或目录的单独属性信息,如文件大小、是否存在、文件修改时间等。
file_exists() 检查文件或目录是否存在 返回值:TRUE/FALSE
fileatime() 文件最后访问时间 返回值:UNIX时间戳格式
filemtime() 文件最后修改时间 返回值:UNIX时间戳格式
filesize() 文件的大小 返回值:字节数/FALSE
filetype() 文件类型 返回值:文件类型/FALSE
is_executable() 判断文件是否可执行 返回值:存在且可执行,返回TRUE
is_readable() 判断文件是否可读 返回值:存在且可读,返回TRUE
is_writable() 判断文件是否可写 返回值:存在且可写,返回TRUE
3、路径处理
可以使用PHP内置函数basename、dirname、pathinfo等函数来获取一个文件的全部或部分路径信息。
(1)basename() 函数返回路径中的文件名部分。
basename(path,suffix)
参数 | 描述 |
---|---|
path | 必需。规定要检查的路径。 |
suffix | 可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。 |
(2)dirname() 函数返回路径中的目录部分。
dirname(path)
参数 | 描述 |
---|---|
path | 必需。规定要检查的路径。 |
说明
path 参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。
(3)pathinfo() 函数以数组的形式返回文件路径的信息。
pathinfo(path,options)
参数 | 描述 |
---|---|
path | 必需。规定要检查的路径。 |
process_sections | 可选。规定要返回的数组元素。默认是 all。可能的值:
|
说明:pathinfo() 返回一个关联数组包含有 path 的信息。
包括以下的数组元素:
- [dirname]
- [basename]
- [extension]
转载请注明:jinglingshu的博客 » PHP文件操作