(独孤九剑)--文件系统
【一】文件系统概述
文件的创建,删除,编辑,复制,粘贴(移动),即文件的增删改查
【二】读取文件
打开读取:readfile(string),传入文件路径即可打开读取(如读取成功,则返回字节数)
打开赋值给变量:file_get_contents(),返回字符型
打开读取关闭分步操作:fopen,fread,fclose
①fopen有两个参数,fopen(打开路径,打开方式),打开方式为只读 / 读写
②fread有两个参数,fread(读取文件名,可选,读取最大字节限制)
③fclose关闭文件,以免打开的文件占用服务器资源
fopen打开文件模式列表:
r 只读,将文件指针指向文件头;
r+ 读写,将文件指针指向文件头;
w 写入方式打开,将文件指针指向文件头并将文件大小截取为0。如果文件不存在则创建文件
w+ 读写方式打开,将文件指针指向文件头并将文件大小截取为0。如果文件不存在则创建文件
a 写入方式打开,将文件指针指向文件尾部。如果文件不存在则创建文件
a+ 读写方式打开,将文件指针指向文件尾部。如果文件不存在则创建文件
x 创建并以写入方式打开。如果已存在,则fopen()调用失败返回FALSE,并生成一条E_WARNING警告级别的错误信息。如果文件不存在则尝试创建
x+ 创建并以读写方式打开。...
(模式对比)
r 只能读,不能fwrite写;
r+ 可读可写;
w 只能写(将文件指针指向文件头,所以会覆盖)
w+ 可读可写(将文件指针指向文件头,所以会覆盖)
a 只能写(将文件指针指向文件尾部,所以会追加)
a+ 可读可写(将文件指针指向文件尾部,所以会追加)
(a模式与w模式对比)
a模式为追加(存在时覆盖),w模式为覆盖(存在时覆盖),x模式覆盖(存在时报错警告)
【三】创建修改文件内容
(1)获取文件内容
file_get_contents返回字符串
不存在则报错,警告错误
$contents = file_get_contents('./new.txt'); echo "$contents";
(2)写入文件内容
file_put_contents返回字节长度
向指定文件写入字符串,如果不存在则创建文件,并返回写入的字节长度
<?php $data = "我是新内容"; $contents = file_put_contents('../tools/demo.txt',$data); if($contents){ echo "写入成功,内容为:".file_get_contents('../tools/demo.txt'); }else{ echo "写入失败或没有权限"; } ?>
(3)fwrite写入内容
fwrite配合fopen可以进行写入操作,别名是fputs
如果不存在则会创建文件;有的话会覆盖原有文件内容
【四】创建临时文件
之前创建的文件为永久文件,fopen()代开文件时x,w,a,x+,w+,a+等模式打开文件时,均会创建永久文件
而平时项目开发里,临时文件也经常用到。
好处:用完即删,不用去维护文件的删除状态
语法:tmpfile()
注意:因为临时文件没有具体路径,所以无法读取文件具体信息,只能返回字节数
<?php $file = tmpfile();//创建临时文件 $content = "向临时文件写入内容"; $numbytes = fwrite($file, $content);//读取临时文件 fclose($file);//关闭临时文件,即被删除 echo "写入了".$numbytes."个字节"; ?>
【五】复制,粘贴(移动),重命名,删除文件
(1)重命名 / 移动:rename(旧名,新名)
<?php fopen('file.txt', 'w+');//创建文件 $filename = 'file.txt';//旧文件 $filename2 = '../demo/newfile.txt';//移动到目标文件,并重命名,也可以原名 rename($filename,$filename2); ?>
若文件不存在则会报错警告(警告级别错误),脚本继续执行
(2)复制 / 粘贴移动:copy(源文件,目标文件)
<?php fopen('file.txt', 'w+');//创建文件 $filename = 'file.txt';//源文件 $filename2 = '../demo/copyfile.txt';//目标文件,复制并重命名 copy($filename,$filename2); ?>
区别:虽然复制和重命名都可以使得目标文件夹下有文件,但是复制命令会保留原先位置文件,而重命名的移动会使原先目标位置文件移除
(3)删除文件
unlink(指定文件路径)
<?php if(unlink('../demo/newfile.txt')){ echo "删除成功"; }else{ echo "删除失败"; } ?>
注意:人工操作删除后,windows回收站可以看到;但是通过此方法删除的在回收站找不到
【六】检测文件属性函数
(1)使用场景举例:
①文件锁----安装软件时,如果软件已经存在,就不让进行安装;
②安装过程里,如果没有写入权限,则不执行安装;
(2)函数
①文件是否存在file_exists()
<?php fopen('./file.txt', 'w+'); if(file_exists('./file.txt')){ echo "文件存在"; }else{ echo "文件不存在"; } ?>
②文件是否可读is_readable()
③文件是否可写is_writeable()
<?php $myfile = fopen('./file.txt', 'w+'); if(is_readable('./file.txt')&&is_writable('./file.txt')){ echo "文件可读可写"; }else{ echo "文件不可读也不可写"; }; fclose($myfile); ?>
④文件是否可执行is_executable()
<?php $myfile = fopen('./index.php', 'w+'); if(is_executable('./index.php')){ echo "文件可执行"; }else{ echo "文件不可执行"; }; fclose($myfile);//如果文件不可执行则会被关闭 ?>
⑤是否是文件is_file()
⑥是否是目录is_dir()
⑦清除文件缓存clearstatcache()
(3)场景举例
①文件锁
安装时如果文件已经存在,则提示已经安装。否则会继续安装
<?php if(file_exists('./file.txt')){ echo "文件已经存在";
exit;//与die()类似,结束脚本 }else{ echo "确定安装"; }; ?>
【七】文件常用函数和常量
(1)文件目录分隔符
Window平台下为 \ ,例如C:\PHPTutorial\WWW;而Linux平台下为 /
注意:windows下也支持 / , 但Linux下不能识别 \ ,所以开发时最好写 /
<?php $path = $_SERVER['SCRIPT_NAME']; echo "当前脚本路径为".$path; ?>
对于 / 有个转 / 为 \ 路径的案例,不太理解,备注下???
(2)文件指针操作函数
①指针回到开始处rewind()
②指针向后移动指定字节fseek()
注意:fread()读取指定长度数组,下次读取时会从原位置接着向后读取
<?php $file = fopen('./test.txt', 'w+'); $data = "我是输入的数据,我叫Tony"; $content = file_put_contents('./test.txt', $data); echo fread($file, 6)."<br>";//读取到第六个字节 rewind($file);//向前移动六个字节 echo fread($file, 6)."<br>";//读取到第六个字节 fseek($file, 6);//向后移动六个字节 echo fread($file, 6);//从第6个字节开始读取 fclose($file); ?>
(3)检测文件大小,统计字节数filesize()
如果想直接移动到最后,则需要先统计字节数,这时用到filesize()
(4)把整个文件读入一个数组里--------file
(5)从文件指针中读取一行,读到最后返回false---fgets
(6)从文件指针中读取一个字符,读到最后返回false---fgetc
(7)将文件截取到指定的长度--ftruncate
(8)文件时间函数
主要为创建,修改,上次访问时间
①filectime();创建时间;②filemtime();修改时间;③fileatime();上次访问时间
<?php $file = fopen('./test.txt', 'w+'); $time1 = filectime('./test.txt');//创建时间 $time2 = filemtime('./test.txt');//修改时间 $time3 = fileatime('./test.txt');//上次访问时间 fclose($file); ?>
【八】文件锁处机制
文件锁的用途:
锁定文件,例如当两个人同时打开一个文件编辑保存时权限问题,所以禁止多人同时操作文件
注意:不论是否加了文件锁,都要释放
锁属性:
LOCK_SH 取得共享锁定(读取的程序)
LOCK_EX 取得独占锁定(写入的程序)
LOCK_UN 释放锁定(无论独占或共享)
<?php $file = fopen('./test.txt', 'w+'); //进行排他锁的锁定 if(flock($file, LOCK_EX)){ fwrite($file, "这时我独占了文件"); //释放锁定 flock($file, LOCK_UN); }else{ echo "锁失败,可能有人在操作,此时无法上锁"; } fclose($file); ?>
【九】目录处理 / 文件夹处理
之前的都是文件处理,这里介绍下目录和文件夹的处理函数(PS:目录就是文件夹,文件夹就是目录)
(1)处理文件夹基本思路:
①读取某路径的时候判断是否是文件夹;
②是文件夹的话,打开指定文件夹,返回文件目录的资源变量;
③readdir逐个读取目录中的文件,每读取一个,文件指针后移一次;
④使用readdir读取到最后,没有可读文件返回false;
⑤关闭文件目录
(2)文件夹 / 目录处理函数
is_dir 判断是否是文件夹
opendir 打开文件夹,返回操作资源
readdir 读取操作资源
closedir 关闭文件夹操作资源
filetype 判断文件 / 文件夹,文件显示file,文件夹显示dir
<?php $dir = 'd:/'; if(is_dir($dir)){ if($dn = opendir($dir)){ echo readdir($dn)."<br>"; echo readdir($dn)."<br>"; echo readdir($dn)."<br>"; echo readdir($dn)."<br>"; echo readdir($dn)."<br>"; echo readdir($dn)."<br>"; closedir($dn); } }else{ echo "不是文件夹"; } ?>
一次性读取完
<?php $dir = '../WWW'; if(is_dir($dir)){ if($dn = opendir($dir)){ while (($file = readdir($dn)) !== false) { echo "文件名是:".$file.";"."文件类型是:".filetype($dir.$$file)."<br>"; } closedir($dn); } }else{ echo "不是文件夹"; } ?>
【十】文件权限设置
使用场景:普通用户只能读取,不可以操作
chmod 修改读取模式
chgrp 修改用户组
chown 修改权限
【十一】文件路径函数
(1)使用场景
①去除文件后缀;
②路径里只取名字,不取目录;
③只取路径名中的目录路径;
④解析网址中各部分,取得独立值;
⑤自己组个url;
(2)常用路径处理函数
pathinfo 返回文件各个组成部分
basename 返回文件名
dirname 文件目录
parse_url 解析网址
http_build_query 生成url中query字符串
http_build_url 生成一个url
①pathinfo 返回文件各个组成部分
解析网址的3种方法,我在文章http://570109268.iteye.com/admin/blogs/2413423里做了总结
<?php $path_part = pathinfo('c:/PHPTutorial/WWW/index.php'); echo "文件目录名:".$path_part['dirname']."<br>"; echo "文件全面:".$path_part['basename']."<br>"; echo "文件扩展名:".$path_part['extension']."<br>"; echo "不包含扩展的文件名:".$path_part['filename']."<br>"; ?>
输出结果:
文件目录名:c:/PHPTutorial/WWW
文件全面:index.php
文件扩展名:php
不包含扩展的文件名:index
②basename 返回文件名
语法:basename(路径,后缀可选)
<?php $path = "/testweb/home.php"; //显示带有文件扩展名的文件名 echo basename($path);//输出home.php //显示不带有文件扩展名的文件名 echo basename($path,".php");//输出home ?>
③dirname 文件目录
④http_build_query() 绑定参数
作用:生成url种的query字符串,使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串
<?php $user = array('name' => 'Tony', 'age' => 23); $userInfo = http_build_query($user); echo $userInfo; ?>
这个有什么用呢,这是模拟http请求的,把得到的数据data通过函数URL-encode,一般是用在回调
【十二】PHP实现文件留言本
主要用到数据存储于读取
【十三】PHP修改配置文件
PHP可以编写修改配置文件