程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP高級特性二之文件處理,

PHP高級特性二之文件處理,

編輯:關於PHP編程

PHP高級特性二之文件處理,


PHP中的文件處理也是一個相當重要的模塊,這一篇的主要內容就是PHP中文件系統的簡介。

文件系統用途

1. 項目處理都離不開文件處理

2. 可以用文件長時間保存數據

3. 建立緩存,在服務器中進行文件操作

文件系統函數用法詳述

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 — 取得文件大小

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

 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); } ?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved