PHP中的文件处理也是一个相当重要的模块,这一篇的主要内容就是PHP中文件系统的简介。
文件系统用途1. 项目处理都离不开文件处理
2. 可以用文件长时间保存数据
3. 建立缓存,在服务器中进行文件操作
文件系统函数用法详述1.基本的判断函数2.文件相关信息获取is_dir— 判断给定文件名是否是一个目录
is_file— 判断给定文件名是否为一个文件
is_executable— 判断给定文件名是否可执行
is_link— 判断给定文件名是否为一个符号连接
is_readable— 判断给定文件名是否可读
is_uploaded_file— 判断文件是否是通过 HTTP POST 上传的
is_writable— 判断给定的文件名是否可写
is_writeable— is_writable 的别名
file_exists— 检查文件或目录是否存在
fileatime— 取得文件的上次访问时间
filectime— 取得文件的 inode 修改时间
filegroup— 取得文件的组
fileinode— 取得文件的 inode
filemtime— 取得文件修改时间
fileowner— 取得文件的所有者
fileperms— 取得文件的权限
filesize— 取得文件大小
filetype— 取得文件类型
下面我们写一个例子,传入文件名,打印它的详细信息。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | function getFileInfo($filename){if(!file_exists($filename)){echo '文件'.($filename).'不存在';return;}if(is_file($filename)){echo $filename.'是一个文件';}if(is_dir($filename)){echo $filename.'是一个目录';}if(is_executable($filename)){echo $filename.'是可执行文件';}else{echo $filename.'不是可执行文件';}if(is_readable($filename)){echo $filename.'是可读的';}else{echo $filename.'不是可读的';}if(is_writable($filename)){echo $filename.'是可写入的';}else{echo $filename.'不是可写入的';}echo '文件'.$filename.'的大小是'.getFileSize(filesize($filename)).'';echo '文件'.$filename.'的类型是'.filetype($filename).'';echo '文件'.$filename.'的所有者是'.fileowner($filename).'';echo '文件'.$filename.'的最后访问时间为'.getTime(fileatime($filename)).'';echo '文件'.$filename.'的inode是'.fileinode($filename).'';echo '文件'.$filename.'的修改时间是'.getTime(filemtime($filename)).'';echo '文件'.$filename.'的权限是'.fileperms($filename).'';}function getTime($time){return date('Y-m-d H:i:s',$time);}function getFileSize($size){$dw = 'B';if($size>=pow(2,40)){$size=round($size/pow(2,40),2);$dw = 'PB';}else if($size>=pow(2,30)){$size=round($size/pow(2,30),2);$dw = 'TB';}else if($size>=pow(2,20)){$size=round($size/pow(2,20),2);$dw = 'GB';}else if($size>=pow(2,10)){$size=round($size/pow(2,10),2);$dw = 'MB';}return $size.$dw;}getFileInfo('1.php'); |
运行结果
3.文件路径相关函数1.php是一个文件1.php不是可执行文件1.php是可读的1.php不是可写入的文件1.php的大小是2MB文件1.php的类型是file文件1.php的所有者是1000文件1.php的最后访问时间为2015-03-04 12:58:33文件1.php的inode是536185文件1.php的修改时间是2015-03-04 12:58:32文件1.php的权限是33204
相对路径:相对于当前目录的上级和下级目录
. 当前目录.. 上一级目录
路径分隔符号
linux/Unix “/”windows “\”不管是什么操作系统PHP的目录分割符号都支技 / (Linux)
绝对路径:可以指的操作系统的根,也可以指的是存放网站的文档根目录
如果是在服务器中执行(通过PHP文件处理函数执行)路径 则 “根”指的就是操作系统的根如果程序是下载的客户端,再访问服务器中的文件时,只有通过Apache访问,“根”也就指的是文档根目录
三个相关函数
basename— 返回路径中的文件名部分
dirname— 返回路径中的目录部分
pathinfo— 返回文件路径的信息
例如下面的例子
12345678 | $url1="./aaa/bbb/index.php";$url2="../www/yyy/login.rar";$url3="c:/appserv/www/demo.html";$url4="http://localhost/yyy/www.gif";echo basename($url1);echo basename($url2);echo basename($url3);echo basename($url4); |
运行结果
index.phplogin.rardemo.htmlwww.gif
可以看出,basename这个函数返回的是文件的名,也就是最后一个项目。下面我们看一下dirname的用法
12345678 | $url1="./aaa/bbb/index.php";$url2="../www/yyy/login.rar";$url3="c:/appserv/www/demo.html";$url4="http://localhost/yyy/www.gif";echo dirname(dirname($url1));echo dirname($url2);echo dirname($url3);echo dirname($url4); |
运行结果
./aaa../www/yyyc:/appserv/wwwhttp://localhost/yyy
可以发现,dirname这个函数可以多层嵌套使用,返回的就是它所在的路径,即除了最后一项之外所有的项。
另外 pathinfo的以上所有信息都可以获取到,另外还包括了文件名和扩展名
比如下面的结果
4. 文件的创建删除修改Array ( [dirname] => ../www/yyy [basename] => login.rar [extension] => rar [filename] => login )
touch— 创建一个文件
unlink— 删除文件
rename— 重命名一个文件或目录
copy—拷贝文件
例如下面的例子
12345 | touch("./php.apahce"); //创建文件unlink("C:/AppServ/www/xsphp/apache.php");//删除文件rename("./test.txt", "d:/test2.txt");//重命名文件copy("cache.txt", "./cache5.txt"); //复制文件chmod("a.txt",755); //设置文件权限 |
权限相关内容
文件读写1. file_get_contents(string)rwx 表这个文件的拥有者 r读 w写 x执行rwx 表这个文件的拥有者所在的组 r读 w写 x执行rwx 其它用户对这个为文件的权限 r读 w写 x执行
传入文件名,直接得到文件中的文本信息,返回的内容即为文件中的文本。
例如
1234 | <?php $str = file_get_contents("1.txt"); echo $str; ?> |
则直接打开了 1.txt 文件中的内容,并返回文件中的文本信息。
如果文件不存在,那么会提示
Warning: file_get_contents(2.txt): failed to open stream: No such file or directory
同样,文件还可以是远程文件,例如,参数传入 http://www.QQ.com
即可以呈现腾讯网的首页内容。
缺点:不能读取指定部分的内容,一次性全部读取。
2. file_put_contents(filename,content)写入文件,filename是写入文件的文件名,content是写入内容,返回值是成功写入的字符长度。
123 | <?php echo file_put_contents("2.txt",'abcd');?> |
2.txt 文件如果不存在,那么则会创建这个文件并写入 abcd 这个字符串,返回 4 ,为字符串的长度。 如果文件存在,则会将文件清空,然后写入字符串,返回写入长度。
缺点:不能以追加的方式写入文件。
3.file(filename)file是直接打开某一个文件,返回的结果是一个数组,每一行是数组的一个元素。也就是说,获取行数只需要输出数组的大小即可。例如
12345 | <?php $str = file("1.txt"); var_dump($str); echo count($str);?> |
即可得到数组形式的行内容,而且输出了行数。
缺点:不能读取指定部分的内容。
4.fopen(filename,mode)filename是文件名,可以是路径加名,也可以是远程服务器文件。
mode是打开文件的方式
r,以只读模式打开文件r+,除了读,还可以写入。w, 以只写的方式打开,如果文件不存在,则创建这个文件,并写放内容,如果文件存在,并原来有内容,则会清除原文件中所有内容,再写入(打开已有的重要文件)w+,除了可以写用fwrite, 还可以读freada,以只写的方式打开,如果文件不存在,则创建这个文件,并写放内容,如果文件存在,并原来有内容,则不清除原有文件内容,再原有文件内容的最后写入新内容,(追加)a+,除了可以写用fwrite, 还可以读freadb,以二进制模式打开文件(图,电影)t,以文本模式打开文件
注意:
r+具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容;
w+具有读写属性,写的时候如果文件存在,会被清空,从头开始写。
返回的是一个文件资源
5.fwrite(file,content)文件写入功能,file是文件资源,用fopen函数获取来的,content是写入内容。同 fputs 函数。
例如
123456789 | <?php $file = fopen("1.txt","r+"); $result = fwrite($file,"xx"); if($result){ echo "Success"; }else echo "Failed"; }?> |
则从头开始写入资源,即把前两个字符设为 xx
6. fread(file,size)读取文件指定部分的长度,file是文件资源,由fopen返回的对象,size是读取字符的长度。
例如
12345 | <?php $file = fopen("1.txt","r"); $content = fread($file,filesize("1.txt")); echo $content;?> |
不过,上述的 filesize 方法只能获取本地文件大小,对于远程文件的读取就要换一种方法了。
例如
12345678 | <?php $file = fopen("http://www.qq.com","r"); $str = ""; while(!feof($file)){ //判断时候到了文件结尾 $str.=fread($file,1024); } echo $str;?> |
file是文件资源,每次读取一行。例如我们读取出腾讯首页