PHP のファイル処理も非常に重要なモジュールです。この記事の主な内容は、PHP のファイル システムの紹介です。
1. プロジェクトの処理はファイルの処理と切り離せないものです
2. ファイルを使用してデータを長期間保存できます
3. キャッシュを作成し、サーバーでファイル操作を実行します
ファイル名を渡してその詳細を出力する例を以下に書いてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 関数 getFileInfo($ファイル名){ if(!file_exists($ファイル名)){ echo 'ファイル'.($ファイル名).'は存在しません'; ️ } if(is_file($ファイル名)){ echo $filename.' はファイルです '; } if(is_dir($ファイル名)){ echo $filename.' はディレクトリです '; } if(is_executable($ファイル名)){ echo $filename.' は実行可能ファイルです'; }else{ echo $filename.'は実行可能ファイルではありません'; } if(is_readable($ファイル名)){ echo $filename.' は読み取れます'; }else{ echo $filename.' は読み取れません' ; } if(is_writable($ファイル名)){ echo $filename.'は書き込み可能です'; }else{ echo $filename.' は書き込み可能ではありません' ; } echo ファイル「.$filename.」のサイズは「.getFileSize(filesize($filename).」です; echo ファイル '.$filename.' は '.filetype($filename).''; echo ファイル '.$filename.' の所有者は '.fileowner($filename).''; echo 'ファイル'.$filename.'の最終アクセス時刻は'.getTime(fileatime($filename))です。 」 ; echo ''file'.$filename.'のinodeは'.fileinode($filename).''; echo 'ファイル「.$filename.」の変更時刻は「.getTime(filemtime($filename))」です。 」; echo '「ファイル'.$filename.」の権限は「.fileperms($filename).」; } 関数 getTime($時間){ 帰り 日付('Y-m-d H:i:s',$時間); } 関数 getFileSize($サイズ){ $dw = 'B'; if($サイズ>=pow(2,40)){ $サイズ=round($size/pow(2,40),2); $dw = 'PB'; }else if($サイズ>=pow(2,30)){ $サイズ=round($size/pow(2,30),2); $dw = 'TB'; }else if($サイズ>=pow(2,20)){ $サイズ=round($size/pow(2,20),2); $dw = 'GB'; }else if($サイズ>=pow(2,10)){ $サイズ=round($size/pow(2,10),2); $dw = 'MB'; } 返品 $サイズ.$dw; } getFileInfo('1.php'); |
运行结果
<p>1.<span id="10_nwp">php是一个文件<br />1.php不是可执行文件<br />1.php是可读的<br />1.php不是可写入的<br />文件1.php的大小是2MB<br />文件1.php的类型是file<br />文件1.php的所有者是1000<br />文件1.php的最后访问时间为2015-03-04 12:58:33<br />文件1.php的inode是536185<br />文件1.php的修改时间是2015-03-04 12:58:32<br />文件1.php的权限是33204</span></p>
相对路径:相对于当前目录的上级和下级目录
<p>. 当前目录<br />.. 上一级目录</p>
路径分隔符号
<p>linux/Unix “/”<br />windows “\”<br />不管是什么操作系统PHP的目录分割符号都支技 / (Linux)</p>
绝对路径:可以指的操作系统的根,也可以指的是存放网站的文档根目录
<p>如果是在服务器中执行(通过PHP文件处理<span id="9_nwp">函数执行)路径 则 “根”指的就是操作系统的根<br />如果程序是下载的客户端,再访问<span id="8_nwp">服务器中的文件时,只有通过Apache访问,“根”也就指的是文档根目录</span></span></p>
三个相关函数
<p>basename — 返回路径中的<span id="7_nwp">文件名部分</span></p> <p>dirname — 返回路径中的目录部分</p> <p>pathinfo — 返回文件路径的信息</p>
例如下面的例子
1 2 3 4 5 6 7 8 | $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); |
运行结果
<p>index.<span id="6_nwp">php<br />login.rar<br />demo.html<br />www.gif</span></p>
可以看出,basename这个函数返回的是文件的名,也就是最后一个项目。
下面我们看一下dirname的用法
1 2 3 4 5 6 7 8 | $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); |
运行结果
<p>./aaa<br />../www/yyy<br />c:/appserv/www<br />http://localhost/yyy</p>
可以发现,dirname这个函数可以多层嵌套使用,返回的就是它所在的路径,即除了最后一项之外所有的项。
另外 pathinfo的以上所有信息都可以获取到,另外还包括了文件名和扩展名
比如下面的结果
<p>Array ( [dirname] => ../www/yyy [basename] => login.rar [extension] => rar [filename] => login )</p>
<p>touch — 创建一个文件</p> <p>unlink — 删除文件</p> <p>rename — 重命名一个文件或目录</p> <p>copy — <span id="5_nwp">拷贝文件</span></p>
例如下面的例子
1 2 3 4 5 | 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); //设置文件权限 |
权限相关内容
<p>rwx 表这个文件的拥有者 r读 w写 x执行<br />rwx 表这个文件的拥有者所在的组 r读 w写 x执行<br />rwx 其它用户对这个为文件的权限 r读 w写 x执行</p>
传入文件名,直接得到文件中的文本信息,返回的内容即为文件中的文本。
例如
1 2 3 4 | $str = file_get_contents("1.txt"); echo $str; ?> |
则直接打开了 1.txt 文件中的内容,并返回文件中的文本信息。
如果文件不存在,那么会提示
<p><strong>Warning</strong>: file_get_contents(2.txt): failed to open stream: No such file or directory</p>
同样,文件还可以是远程文件,例如,参数传入 http://www.qq.com
即可以呈现腾讯网的首页内容。
缺点:不能读取指定部分的内容,一次性全部读取。
写入文件,filename是写入文件的文件名,content是写入内容,返回值是成功写入的字符长度。
1 2 3 | echo file_put_contents("2.txt",'abcd'); ?> |
2.txt 文件如果不存在,那么则会创建这个文件并写入 abcd 这个字符串,返回 4 ,为字符串的长度。 如果文件存在,则会将文件清空,然后写入字符串,返回写入长度。
缺点:不能以追加的方式写入文件。
file是直接打开某一个文件,返回的结果是一个数组,每一行是数组的一个元素。也就是说,获取行数只需要输出数组的大小即可。例如
1 2 3 4 5 | $str = file("1.txt"); var_dump($str); echo count($str); ?> |
即可得到数组形式的行内容,而且输出了行数。
缺点:不能读取指定部分的内容。
filename是文件名,可以是路径加名,也可以是远程服务器文件。
mode是打开文件的方式
<p>r,以只读模式打开文件<br />r+,除了读,还可以写入。<br />w, 以只写的方式打开,如果文件不存在,则创建这个文件,并写放内容,如果文件存在,并原来有内容,则会清除原文件中所有内容,再写入(打开已有的重要文件)<br />w+,除了可以写用fwrite, 还可以读fread<br />a,以只写的方式打开,如果文件不存在,则创建这个文件,并写放内容,如果文件存在,并原来有内容,则不清除原有文件内容,再原有文件内容的最后写入新内容,(追加)<br />a+,除了可以写用fwrite, 还可以读fread<br />b,以二进制模式打开文件(图,电影)<br />t,以文本模式打开文件</p>
注意:
<p>r+具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容;</p> <p>w+具有读写属性,写的时候如果文件存在,会被清空,从头开始写。</p>
返回的是一个文件资源
文件写入功能,file是文件资源,用fopen函数获取来的,content是写入内容。同 fputs 函数。
例如
1 2 3 4 5 6 7 8 9 | php $file = fopen("1.txt","r+"); $result = fwrite($file,"xx"); if($result){ echo "Success"; }else echo "Failed"; } ?> |
则从头开始写入资源,即把前两个字符设为 xx
读取文件指定部分的长度,file是文件资源,由fopen返回的对象,size是读取字符的长度。
例如
1 2 3 4 5 | $file = fopen("1.txt","r"); $content = fread($file,filesize("1.txt")); echo $content; ?> |
ただし、上記のファイルサイズメソッドはローカルファイルサイズしか取得できず、リモートファイルを読み取るには別のメソッドが必要です。
例えば
1 2 3 4 5 6 7 8 | $file = fopen("http://www.qq.com","r"); $str = ""; while(!feof($file)){ //判断する時はファイルの終わりです $str.=fread($file,1024); } エコー $str; ?> |
file はファイル リソースであり、一度に 1 行ずつ読み取ります。たとえば、テンセントのホームページに何行あるかを読み取ります。
1 2 3 4 5 6 7 8 9 10 | $file = fopen("http://www.qq.com","r"); $str = ""; $count = 0; ながら(!feof($file)){ $str .= fgets($file); $count ++; } エコー $count; ?> |
結果 8893 が出力されます。ソース ファイルの合計行数を確認して確認できます。
fgets メソッドとよく似ていますが、file はファイル リソースであり、毎回文字を読み取ります。たとえば、テンセントのホームページに何文字あるのかを読み取ります。
1 2 3 4 5 6 7 8 9 10 | $file = fopen("http://www.qq.com","r"); $str = ""; $count = 0; ながら(!feof($file)){ $str .= fgetc($file); $count ++; } エコー $count; ?> |
上述代码便会输出所有的字符数量。
ftell 是返回当前读文件的指针位置,file 是文件资源,是由 fopen 返回的对象。
file
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
offset
偏移量。
要移动到文件尾之前的位置,需要给 offset 传递一个负值,并设置 whence 为 SEEK_END。
whence
<p>SEEK_SET – 设定位置等于 offset 字节。</p> <p>SEEK_CUR – 设定位置为当前位置加上 offset。</p> <p>SEEK_END – 设定位置为文件尾加上 offset。</p>
回到文件头部,file是文件资源
例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
php
$file = fopen("1.txt","r");
echo ftell($file)." "; //読み取り前のポインタ位置を出力 echo fread($file,10)." "; //10文字を読み取り、ポインタを10単位移動します echo ftell($file)." "; //読み取り後に現在のポインタ位置を出力します fseek($file,20,SEEK_CUR); //現在のポインタが20単位進みます echo ftell($file)." "; //移動後のポインタの位置を出力 echo fread($file,10)." "; //読み取った10文字を出力します echo ftell($file)." "; //10文字読み取った後のポインタの位置を出力 fseek($file,-20,SEEK_END); //ポインタをファイル末尾の最初の20文字に移動します echo ftell($file)." "; //移動後のポインタの位置を出力 echo fread($file,10)." "; //输出文件末尾20个字符 echo ftell($file)." "; //输出读完10个字符之后指针的位置 rewind($file); //回到文件头部 echo ftell($file)." "; //输出移动之后指针的位置 ?> |
运行结果:
<p>0<br />cuiqingcai<br />10<br />30<br />uiqingcai.<br />40<br />374<br />i.comcuiqi<br />384<br />0</p>
file
文件资源指针,是典型地由 fopen() 创建的 resource(资源)。
operation
operation 可以是以下值之一:
<p>LOCK_SH取得共享锁定(读取的程序)。</p> <p>LOCK_EX 取得独占锁定(写入的程序。</p> <p>LOCK_UN 释放锁定(无论共享或独占)。</p>
如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。
wouldblock
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE。(Windows 上不支持)
例如
1 2 3 4 5 6 7 | php $file = fopen("1.txt","a"); if(flock($file,LOCK_EX)){ fwrite($file,"xxx"); flock($file,LOCK_UN); } ?> |