天天看點

php中檔案讀寫總結,PHP中檔案讀寫操作

PHP中檔案讀寫操作

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

以下是一篇關于檔案基本讀寫操作的文章,我曾經就是看了這篇文章後學會檔案基本操作的,在這裡發出來與大家共享:

讀檔案:

PHP代碼:

1.    <?php

2.     

3.    $file_name = "data.dat";

4.    // 要讀取的檔案的絕對路徑: homedata.dat

5.     

6.    $file_pointer = fopen($file_name, "r");

7.    // 打開檔案,8.    "r" 是一種模式,9.    或者說我們要進行的操作方法,10.    詳見本文後面的介紹

11.     

12.    $file_read = fread($file_pointer, filesize($file_name));

13.    // 通過檔案指14.    針讀取檔案内容

15.     

16.    fclose($file_pointer);

17.    // 關閉檔案

18.     

19.    print "讀取到的檔案内容是: $file_read";

20.    // 顯示檔案内容

21.    ?>

22.     

寫檔案:

PHP代碼:

1.    <?php

2.     

3.    $file_name = "data.dat";

4.    // 絕對路徑: homedata.dat

5.     

6.    $file_pointer = fopen($file_name, "w");

7.    // "w"是一種模式,8.    詳見後面

9.     

10.    fwrite($file_pointer, "what you wanna write");

11.    // 先把檔案剪切12.    為0位元組大小,13.     然後寫入

14.     

15.    fclose($file_pointer);

16.    // 結束

17.     

18.    print "資料成功寫入檔案";

19.     

20.    ?>

21.     

追加到檔案後面:

PHP代碼:

1.    <?php

2.     

3.    $file_name = "data.dat";

4.    // 絕對路徑: homedata.dat

5.     

6.    $file_pointer = fopen($file_name, "a");

7.    // "w"模式

8.     

9.    fwrite($file_pointer, "what you wanna append");

10.    // 不11.    把檔案剪切12.    成0位元組,13.     把資料追加到檔案最後

14.     

15.    fclose($file_pointer);

16.    // 結束

17.     

18.    print "資料成功追加到檔案";

19.     

20.    ?>

21.     

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

有時候會發生多人寫入的情況(最常見是在流量較大的網站),會産生無用的資料寫入檔案, 例如:

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.     

3.    $file_name = "data.dat";

4.     

5.    $file_pointer = fopen($file_name, "r");

6.     

7.    $lock = flock($file_pointer, LOCK_SH);

8.    // 我使用4.0.2,9.    是以用LOCK_SH,10.    你可能需要直接寫成 1.

11.     

12.    if ($lock) {

13.     

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.     

19.    }

20.     

21.    fclose($file_pointer);

22.     

23.    print "檔案内容為 $file_read";

24.     

25.    ?>

26.     

上例中,如果兩個檔案read.php和read2.php都要存取該檔案,那麼它們都可以讀取,但是當一個程式需要寫入的時候,它必須等待,直到讀操作完成,檔案所釋放。

PHP代碼:

1.    <?php

2.     

3.    $file_name = "data.dat";

4.     

5.    $file_pointer = fopen($file_name, "w");

6.     

7.    $lock = flock($file_pointer, LOCK_EX);

8.    // 如果版本低于PHP4.0.2,9.     用 2 代替 LOCK_EX

10.     

11.    if ($lock) {

12.     

13.    fwrite($file_pointer, "what u wanna write");

14.    flock($file_pointer, LOCK_UN);

15.    // 如果版本低于PHP4.0.2,16.     用 3 代替 LOCK_UN

17.     

18.    }

19.     

20.    fclose($file_pointer);

21.     

22.    print "資料成功寫入檔案";

23.     

24.    ?>

25.     

雖然"w"模式用來覆寫檔案, 單我覺得不适用。

PHP代碼:

1.    <?php

2.     

3.    $file_name = "data.dat";

4.     

5.    $file_pointer = fopen($file_name, "a");

6.     

7.    $lock = flock($file_pointer, LOCK_EX);

8.    // 如果版本低于PHP4.0.2,9.     用 2 代替 LOCK_EX

10.     

11.    if ($lock) {

12.     

13.    fseek($file_pointer, 0, SEEK_END);

14.    // 如果版本小于PHP4.0RC1,15.     使用 fseek($file_pointer, filsize($file_name));

16.     

17.    fwrite($file_pointer, "what u wanna write");

18.    flock($file_pointer, LOCK_UN);

19.    // 如果版本低于PHP4.0.2,20.     用 3 代替 LOCK_UN

21.     

22.    }

23.     

24.    fclose($file_pointer);

25.     

26.    print "資料成功寫入檔案";

27.     

28.    ?>

29.     

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 

$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;

}

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