PHP中檔案讀寫操作

來源:互聯網
上載者:User
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; 


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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.