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

PHP中文件讀寫操作

編輯:關於PHP編程

PHP中文件讀寫操作


  PHP中提供了一系列的I/O函數,能簡捷地實現我們所需要的功能,包括文件系統操作和目錄操作(如“復制[copy]”)。下面給大家介紹的是基本的文件讀寫操作:(1)讀文件;(2)寫文件;(3)追加到文件。

  以下是一篇關於文件基本讀寫操作的文章,我曾經就是看了這篇文章後學會文件基本操作的,在這裡發出來與大家共享:
讀文件:
PHP代碼:
1.    <?php 
2.    &nbsp;
3.    $file_name = "data.dat"; 
4.    // 要讀取的文件的絕對路徑: homedata.dat 
5.    &nbsp;
6.    $file_pointer = fopen($file_name, "r"); 
7.    // 打開文件,8.    "r" 是一種模式,9.    或者說我們要進行的操作方法,10.    詳見本文後面的介紹
11.    &nbsp;
12.    $file_read = fread($file_pointer, filesize($file_name)); 
13.    // 通過文件指14.    針讀取文件內容
15.    &nbsp;
16.    fclose($file_pointer); 
17.    // 關閉文件
18.    &nbsp;
19.    print "讀取到的文件內容是: $file_read"; 
20.    // 顯示文件內容
21.    ?> 
22.    &nbsp;

寫文件:
PHP代碼:
1.    <?php 
2.    &nbsp;
3.    $file_name = "data.dat"; 
4.    // 絕對路徑: homedata.dat 
5.    &nbsp;
6.    $file_pointer = fopen($file_name, "w"); 
7.    // "w"是一種模式,8.    詳見後面
9.    &nbsp;
10.    fwrite($file_pointer, "what you wanna write"); 
11.    // 先把文件剪切12.    為0字節大小,13.     然後寫入
14.    &nbsp;
15.    fclose($file_pointer); 
16.    // 結束
17.    &nbsp;
18.    print "數據成功寫入文件"; 
19.    &nbsp;
20.    ?> 
21.    &nbsp;

追加到文件後面:
PHP代碼:
1.    <?php 
2.    &nbsp;
3.    $file_name = "data.dat"; 
4.    // 絕對路徑: homedata.dat 
5.    &nbsp;
6.    $file_pointer = fopen($file_name, "a"); 
7.    // "w"模式
8.    &nbsp;
9.    fwrite($file_pointer, "what you wanna append"); 
10.    // 不11.    把文件剪切12.    成0字節,13.     把數據追加到文件最後
14.    &nbsp;
15.    fclose($file_pointer); 
16.    // 結束
17.    &nbsp;
18.    print "數據成功追加到文件"; 
19.    &nbsp;
20.    ?> 
21.    &nbsp;

以上只是簡單介紹,下面我們要討論一些更深層的。

有時候會發生多人寫入的情況(最常見是在流量較大的網站),會產生無用的數據寫入文件, 例如:

info.file文件內容如下 -> 

|1|Mukul|15|Male|India (n) 
|2|Linus|31|Male|Finland (n) 

現在兩個人同時注冊,引起文件破壞-> 

info.file -> 

|1|Mukul|15|Male|India 
|2|Linus|31|Male|Finland 
|3|Rob|27|Male|USA| 
Bill|29|Male|USA 

上例中當PHP寫入Rob的信息到文件的時候,Bill正好也開始寫入,這時候正好需要寫入Rob紀錄的'n',引起文件破壞。

我們當然不希望發生這樣的情況, 所以讓我們看看文件鎖定:
PHP代碼:
1.    <?php 
2.    &nbsp;
3.    $file_name = "data.dat"; 
4.    &nbsp;
5.    $file_pointer = fopen($file_name, "r"); 
6.    &nbsp;
7.    $lock = flock($file_pointer, LOCK_SH); 
8.    // 我使用4.0.2,9.    所以用LOCK_SH,10.    你可能需要直接寫成 1. 
11.    &nbsp;
12.    if ($lock) { 
13.    &nbsp;
14.    $file_read = fread($file_pointer, filesize($file_name)); 
15.    $lock = flock($file_pointer, LOCK_UN); 
16.    // 如果版本小於PHP4.0.2,17.     用 3 代替 LOCK_UN
18.    &nbsp;
19.    } 
20.    &nbsp;
21.    fclose($file_pointer); 
22.    &nbsp;
23.    print "文件內容為 $file_read"; 
24.    &nbsp;
25.    ?> 
26.    &nbsp;

上例中,如果兩個文件read.php和read2.php都要存取該文件,那麼它們都可以讀取,但是當一個程序需要寫入的時候,它必須等待,直到讀操作完成,文件所釋放。
PHP代碼:
1.    <?php 
2.    &nbsp;
3.    $file_name = "data.dat"; 
4.    &nbsp;
5.    $file_pointer = fopen($file_name, "w"); 
6.    &nbsp;
7.    $lock = flock($file_pointer, LOCK_EX); 
8.    // 如果版本低於PHP4.0.2,9.     用 2 代替 LOCK_EX
10.    &nbsp;
11.    if ($lock) { 
12.    &nbsp;
13.    fwrite($file_pointer, "what u wanna write"); 
14.    flock($file_pointer, LOCK_UN); 
15.    // 如果版本低於PHP4.0.2,16.     用 3 代替 LOCK_UN
17.    &nbsp;
18.    } 
19.    &nbsp;
20.    fclose($file_pointer); 
21.    &nbsp;
22.    print "數據成功寫入文件"; 
23.    &nbsp;
24.    ?> 
25.    &nbsp;

雖然"w"模式用來覆蓋文件, 單我覺得不適用。
PHP代碼:
1.    <?php 
2.    &nbsp;
3.    $file_name = "data.dat"; 
4.    &nbsp;
5.    $file_pointer = fopen($file_name, "a"); 
6.    &nbsp;
7.    $lock = flock($file_pointer, LOCK_EX); 
8.    // 如果版本低於PHP4.0.2,9.     用 2 代替 LOCK_EX
10.    &nbsp;
11.    if ($lock) { 
12.    &nbsp;
13.    fseek($file_pointer, 0, SEEK_END); 
14.    // 如果版本小於PHP4.0RC1,15.     使用 fseek($file_pointer, filsize($file_name)); 
16.    &nbsp;
17.    fwrite($file_pointer, "what u wanna write"); 
18.    flock($file_pointer, LOCK_UN); 
19.    // 如果版本低於PHP4.0.2,20.     用 3 代替 LOCK_UN
21.    &nbsp;
22.    } 
23.    &nbsp;
24.    fclose($file_pointer); 
25.    &nbsp;
26.    print "數據成功寫入文件"; 
27.    &nbsp;
28.    ?> 
29.    &nbsp;

Hmmm..., 對於追加數據與其他操作有點不同,就是FSEEK! 確認文件指針在文件尾部總是一個好習慣。

如果是在Windows系統下, 上面的文件中文件名前面需要加上''. 

FLOCK雜談: 

Flock()只在文件打開後才鎖定。 在上列中文件打開後才獲得鎖定,現在文件的內容只是在當時的內容, 而不反映出別的程序操作的結果,因此不只是在文件追加操作,就是對讀取操作也應該使用fseek。
(此處翻譯可能不是很確切, 但我想意思到了)。

關於模式:

'r' - 只讀方式打開, 文件指針置於文件頭

'r+' - 讀寫方式打開,文件指針置於文件頭

'w' - 只寫打開,文件指針置於文件頭, 文件被剪切為0字節, 如果文件不存在, 嘗試建立文件

'w+' - 讀寫打開,文件指針置於文件頭, 文件大小被剪切為0字節,如果文件不存在, 嘗試建立文件

'a' - 只寫方式打開,文件指針置於文件尾,如果文件不存在,嘗試建立文件

'a+' - 讀寫打開,文件指針置於文件尾,如果文件不存在, 嘗試建立文件

順便說一下創建文件目錄的代碼

//創建類似"../../../xxx/xxx.txt"的目錄

function createdirs($path, $mode = 0777) //mode 077

$dirs = explode('/',$path); 
$pos = strrpos($path, "."); 
if ($pos === false) { // note: three equal signs 
// not found, means path ends in a dir not file 
$subamount=0; 

else { 
$subamount=1; 


for ($c=0;$c < count($dirs) - $subamount; $c++) { 
$thispath=""; 
for ($cc=0; $cc <= $c; $cc++) { 
$thispath.=$dirs[$cc].'/'; 

if (!file_exists($thispath)) { 
//print "$thispath
"; 
mkdir($thispath,$mode); //mkdir函數創建目錄


}
//調用如createdirs("xxx/xxxx/xxxx",);

//原函數中使用$GLOBALS["dirseparator"]我改成了'/' 

function recur_mkdirs($path, $mode = 0777) //mode 0777

//$GLOBALS["dirseparator"] 
$dirs = explode($GLOBALS["dirseparator"],$path); 
$pos = strrpos($path, "."); 
if ($pos === false) { // note: three equal signs 
// not found, means path ends in a dir not file 
$subamount=0; 

else { 
$subamount=1; 


這些只是一些基本的關於文件的操作代碼,相信對初學者很有用,在此貼出來,希望有拋磚引玉之功能!

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