PHP高階特性之檔案處理
檔案系統函式用法詳述
1.基本的判斷函式
is_dir — 判斷給定檔名是否是一個目錄
is_file — 判斷給定檔名是否為一個檔案
is_executable — 判斷給定檔名是否可執行
is_link — 判斷給定檔名是否為一個符號連線
is_readable — 判斷給定檔名是否可讀
is_uploaded_file — 判斷檔案是否是通過 HTTP POST 上傳的
is_writable — 判斷給定的檔名是否可寫
is_writeable — is_writable 的別名
2.檔案相關資訊獲取
file_exists — 檢查檔案或目錄是否存在
fileatime — 取得檔案的上次訪問時間
filectime — 取得檔案的 inode 修改時間
filegroup — 取得檔案的組
fileinode — 取得檔案的 inode
filemtime — 取得檔案修改時間
fileowner — 取得檔案的所有者
fileperms — 取得檔案的許可權
filesize — 取得檔案大小
— 取得檔案型別
下面我們寫一個例子,傳入檔名,列印它的詳細資訊。
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
3.檔案路徑相關函式
相對路徑:相對於當前目錄的上級和下級目錄
. 當前目錄
.. 上一級目錄
路徑分隔符號
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的用法
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); |
執行結果
./aaa
../www/yyy
c:/appserv/www
http://localhost/yyy
可以發現,dirname這個函式可以多層巢狀使用,返回的就是它所在的路徑,即除了最後一項之外所有的項。
另外 pathinfo的以上所有資訊都可以獲取到,另外還包括了檔名和副檔名
比如下面的結果
Array ( [dirname] => ../www/yyy [basename] => login.rar [extension] => rar [filename] => login )
4. 檔案的建立刪除修改
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. file_get_contents(string)
傳入檔名,直接得到檔案中的文字資訊,返回的內容即為檔案中的文字。
例如
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
即可以呈現騰訊網的首頁內容。
缺點:不能讀取指定部分的內容,一次性全部讀取。
2. file_put_contents(filename,content)
寫入檔案,filename是寫入檔案的檔名,content是寫入內容,返回值是成功寫入的字元長度。
1 2 3 |
<?php echo file_put_contents("2.txt",'abcd'); ?> |
2.txt 檔案如果不存在,那麼則會建立這個檔案並寫入 abcd 這個字串,返回 4 ,為字串的長度。 如果檔案存在,則會將檔案清空,然後寫入字串,返回寫入長度。
缺點:不能以追加的方式寫入檔案。
3.file(filename)
file是直接開啟某一個檔案,返回的結果是一個數組,每一行是陣列的一個元素。也就是說,獲取行數只需要輸出陣列的大小即可。例如
1 2 3 4 5 |
<?php $str = file("1.txt"); var_dump($str); echo count($str); ?> |
即可得到陣列形式的行內容,而且輸出了行數。
缺點:不能讀取指定部分的內容。
4.fopen(filename,mode)
filename是檔名,可以是路徑加名,也可以是遠端伺服器檔案。
mode是開啟檔案的方式
r,以只讀模式開啟檔案
r+,除了讀,還可以寫入。
w, 以只寫的方式開啟,如果檔案不存在,則建立這個檔案,並寫放內容,如果檔案存在,並原來有內容,則會清除原檔案中所有內容,再寫入(開啟已有的重要檔案)
w+,除了可以寫用fwrite, 還可以讀fread
a,以只寫的方式開啟,如果檔案不存在,則建立這個檔案,並寫放內容,如果檔案存在,並原來有內容,則不清除原有檔案內容,再原有檔案內容的最後寫入新內容,(追加)
a+,除了可以寫用fwrite, 還可以讀fread
b,以二進位制模式開啟檔案(圖,電影)
t,以文字模式開啟檔案
注意:
r+具有讀寫屬性,從檔案頭開始寫,保留原檔案中沒有被覆蓋的內容;
w+具有讀寫屬性,寫的時候如果檔案存在,會被清空,從頭開始寫。
返回的是一個檔案資源
5.fwrite(file,content)
檔案寫入功能,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
6. fread(file,size)
讀取檔案指定部分的長度,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; ?> |
7.fgets(file)
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,我們可以檢視原始檔,看看它一共有多少行,驗證一下即可。
7.fgetc(file)
與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; ?> |
上述程式碼便會輸出所有的字元數量。
8.ftell(file)
ftell 是返回當前讀檔案的指標位置,file 是檔案資源,是由 fopen 返回的物件。
9.fseek(file,offset,whence)
file
檔案系統指標,是典型地由 fopen() 建立的 resource(資源)。
offset
偏移量。
要移動到檔案尾之前的位置,需要給 offset 傳遞一個負值,並設定 whence 為 SEEK_END。
whence
SEEK_SET – 設定位置等於 offset 位元組。
SEEK_CUR – 設定位置為當前位置加上 offset。
SEEK_END – 設定位置為檔案尾加上 offset。
10.rewind($file)
回到檔案頭部,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
11.flock(file,operation[,wouldblock])
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); } ?> |