PHP中的文件處理也是一個相當重要的模塊,這一篇的主要內容就是PHP中文件系統的簡介。
1. 項目處理都離不開文件處理
2. 可以用文件長時間保存數據
3. 建立緩存,在服務器中進行文件操作
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 — 取得文件類型
下面我們寫一個例子,傳入文件名,打印它的詳細信息。
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 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');運行結果
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 — 返回文件路徑的信息
例如下面的例子
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);運行結果
index.php
login.rar
demo.html
www.gif
可以看出,basename這個函數返回的是文件的名,也就是最後一個項目。
下面我們看一下dirname的用法
運行結果
./aaa
../www/yyy
c:/appserv/www
http://localhost/yyy
可以發現,dirname這個函數可以多層嵌套使用,返回的就是它所在的路徑,即除了最後一項之外所有的項。
另外 pathinfo的以上所有信息都可以獲取到,另外還包括了文件名和擴展名
比如下面的結果
Array ( [dirname] => ../www/yyy [basename] => login.rar [extension] => rar [filename] => login )
touch — 創建一個文件
unlink — 刪除文件
rename — 重命名一個文件或目錄
copy — 拷貝文件
例如下面的例子
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); //設置文件權限權限相關內容
rwx 表這個文件的擁有者 r讀 w寫 x執行
rwx 表這個文件的擁有者所在的組 r讀 w寫 x執行
rwx 其它用戶對這個為文件的權限 r讀 w寫 x執行
傳入文件名,直接得到文件中的文本信息,返回的內容即為文件中的文本。
例如
1 2 3 4 <?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
即可以呈現騰訊網的首頁內容。
缺點:不能讀取指定部分的內容,一次性全部讀取。
寫入文件,filename是寫入文件的文件名,content是寫入內容,返回值是成功寫入的字符長度。
1 2 3 <?php echo file_put_contents("2.txt",'abcd'); ?>2.txt 文件如果不存在,那麼則會創建這個文件並寫入 abcd 這個字符串,返回 4 ,為字符串的長度。 如果文件存在,則會將文件清空,然後寫入字符串,返回寫入長度。
缺點:不能以追加的方式寫入文件。
file是直接打開某一個文件,返回的結果是一個數組,每一行是數組的一個元素。也就是說,獲取行數只需要輸出數組的大小即可。例如
1 2 3 4 5 <?php $str = file("1.txt"); var_dump($str); echo count($str); ?>即可得到數組形式的行內容,而且輸出了行數。
缺點:不能讀取指定部分的內容。
filename是文件名,可以是路徑加名,也可以是遠程服務器文件。
mode是打開文件的方式
r,以只讀模式打開文件
r+,除了讀,還可以寫入。
w, 以只寫的方式打開,如果文件不存在,則創建這個文件,並寫放內容,如果文件存在,並原來有內容,則會清除原文件中所有內容,再寫入(打開已有的重要文件)
w+,除了可以寫用fwrite, 還可以讀fread
a,以只寫的方式打開,如果文件不存在,則創建這個文件,並寫放內容,如果文件存在,並原來有內容,則不清除原有文件內容,再原有文件內容的最後寫入新內容,(追加)
a+,除了可以寫用fwrite, 還可以讀fread
b,以二進制模式打開文件(圖,電影)
t,以文本模式打開文件
注意:
r+具有讀寫屬性,從文件頭開始寫,保留原文件中沒有被覆蓋的內容;
w+具有讀寫屬性,寫的時候如果文件存在,會被清空,從頭開始寫。
返回的是一個文件資源
文件寫入功能,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 <?php $file = fopen("1.txt","r"); $content = fread($file,filesize("1.txt")); echo $content; ?>不過,上述的 filesize 方法只能獲取本地文件大小,對於遠程文件的讀取就要換一種方法了。
例如
1 2 3 4 5 6 7 8 <?php $file = fopen("http://www.qq.com","r"); $str = ""; while(!feof($file)){ //判斷時候到了文件結尾 $str.=fread($file,1024); } echo $str; ?>
file是文件資源,每次讀取一行。例如我們讀取出騰訊首頁一共有多少行。
1 2 3 4 5 6 7 8 9 10 <?php $file = fopen("http://www.qq.com","r"); $str = ""; $count = 0; while(!feof($file)){ $str .= fgets($file); $count ++; } echo $count; ?>會輸出結果 8893,我們可以查看源文件,看看它一共有多少行,驗證一下即可。
與fgets方法很相似,file是文件資源,每次讀取個字符。例如我們讀取出騰訊首頁一共有多少個字符。
1 2 3 4 5 6 7 8 9 10 <?php $file = fopen("http://www.qq.com","r"); $str = ""; $count = 0; while(!feof($file)){ $str .= fgetc($file); $count ++; } echo $count; ?>上述代碼便會輸出所有的字符數量。
ftell 是返回當前讀文件的指針位置,file 是文件資源,是由 fopen 返回的對象。
file
文件系統指針,是典型地由 fopen() 創建的 resource(資源)。
offset
偏移量。
要移動到文件尾之前的位置,需要給 offset 傳遞一個負值,並設置 whence 為 SEEK_END。
whence
SEEK_SET – 設定位置等於 offset 字節。
SEEK_CUR – 設定位置為當前位置加上 offset。
SEEK_END – 設定位置為文件尾加上 offset。
回到文件頭部,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)."<br>"; //輸出讀取前的指針位置 echo fread($file,10)."<br>"; //讀取10個字符,指針移動10個單位 echo ftell($file)."<br>"; //輸出讀取完之後當前指針位置 fseek($file,20,SEEK_CUR); //當前指針前移20單位 echo ftell($file)."<br>"; //輸出移動之後指針的位置 echo fread($file,10)."<br>"; //輸出讀取的10個字符 echo ftell($file)."<br>"; //輸出讀完10個字符之後指針的位置 fseek($file,-20,SEEK_END); //指針移動到文件末尾前20個字符 echo ftell($file)."<br>"; //輸出移動之後指針的位置 echo fread($file,10)."<br>"; //輸出文件末尾20個字符 echo ftell($file)."<br>"; //輸出讀完10個字符之後指針的位置 rewind($file); //回到文件頭部 echo ftell($file)."<br>"; //輸出移動之後指針的位置 ?>運行結果:
0
cuiqingcai
10
30
uiqingcai.
40
374
i.comcuiqi
384
0
file
文件資源指針,是典型地由 fopen() 創建的 resource(資源)。
operation
operation 可以是以下值之一:
LOCK_SH取得共享鎖定(讀取的程序)。
LOCK_EX 取得獨占鎖定(寫入的程序。
LOCK_UN 釋放鎖定(無論共享或獨占)。
如果不希望 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); } ?>