PHP檔案讀寫操作學習

WBOY
發布: 2016-07-25 08:51:36
原創
930 人瀏覽過
  1. // 注意在4.0.0-RC2 之前不存在!== 運算子

  2. if ($handle = opendir('/path/to/files')) {

  3. echo "Directory handle: $handlen";
  4. echo "Files:n";
  5. while (false !== ($file = readdir($handle))) {
  6. echo "$filen";
  7. }
  8. while ($file = readdir($handle )) {
  9. echo "$filen";
  10. }
  11. closedir($handle);

  12. }
  13. ?>
複製程式碼

讀取檔案:

  1. $file_name = "data.dat";
  2. // 要讀取的檔案的絕對路徑: homedata.dat: homedata.dat
  3. $file_pointer = fopen($file_name, "r");
  4. // 開啟文件,8. "r" 是一種模式,9. 或者說我們要進行的操作方法,10. 詳見本文後面的介紹
  5. $file_read = fread($file_pointer, filesize($file_name));
  6. // 透過檔案指14. 針讀取檔案內容
  7. fclose($file_pointer);
  8. //關閉檔案
  9. print "讀取的檔案內容是: $file_read";
  10. // 顯示檔案內容
  11. ?>
複製程式碼

複製程式碼
    寫文件:
  1. $file_name = "data.dat";
  2. // 絕對路徑: homedata.dat
  3. $file_pointer = $file_pointer = $file_pointer = $file_pointer = fopen($file_name, "w");
  4. // "w"是一種模式,8. 詳見後面
  5. fwrite($file_pointer, "what you wanna write");
  6. // 先把檔案剪下12. 0位元組大小,13. 然後寫入
fclose($file_pointer);
// 結束 print "資料成功寫入檔案"; ?>

複製程式碼
    追加到檔案後面:
  1. $file_name = "data.dat";

  2. // 絕對路徑: homedata.dat
  3. $file_pointer = fopen($file_name, "a");

  4. // "w"模式
  5. fwrite($file_pointer, "what you wanna append");
  6. // 不11. 把檔案剪下12. 成0字節,13. 把資料追加到檔案最後
  7. fclose($file_pointer);
  8. // 結束
print "資料成功追加到檔案";
?>

複製程式碼

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

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

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',引起文件破壞。
    我們當然不希望發生這樣的情況, 所以讓我們看看檔案鎖定:
  1. $file_name = "data.dat";
  2. $file_pointer = fopen($file_name, "r");
  3. $lock = flock($file_pointer, LOCK_SH);
  4. // 我用4.0.2,9. 所以用LOCK_SH,10. 你可能需要直接寫成1.
  5. if ($lock) {
  6. $file_read = fread($file_pointer, filesize($file_name));
  7. $lock = flock($file_pointer, LOCK_UN);
  8. // 若版本小於PHP4.0.2,17. 以3 取代LOCK_UN
  9. }
fclose($file_pointer);
print "文件內容為$file_read"; ?>

複製代碼
    上例中,如果兩個文件read.php和read2.php都要訪問該文件,那麼它們都可以讀取,但是當一個程式需要寫入的時候,它必須等待,直到讀取操作完成,文件所釋放。
  1. $file_name = "data.dat";
  2. $file_pointer = fopen($file_name, "w");
  3. $lock = flock($file_pointer, LOCK_EX);
  4. // 如果版本低於PHP4.0.2,9. 用2 代替LOCK_EX
  5. if ($lock) {
  6. fwrite($file_pointer, " what u wanna write");
  7. flock($file_pointer, LOCK_UN);
  8. // 如果版本低於PHP4.0.2,16. 用3 代替LOCK_UN
  9. }
fclose($file_pointer);
print "資料成功寫入檔案"; ?> 複製程式碼

雖然"w"模式用來覆蓋文件, 單我覺得不適用。

  1. $file_name = "data.dat";

  2. $file_pointer = fopen($file_name, "a");
  3. $lock = flock($file_pointer, LOCK_EX);
  4. // 如果版本低於PHP4.0.2,9. 用2 代替LOCK_EX
  5. if ( $lock) {

  6. fseek($file_pointer, 0, SEEK_END);
  7. // 如果版本小於PHP4.0RC1,15. 使用fseek($file_pointer, filsize($file_name));
  8. fwrite($file_pointer, "what u wanna write");

  9. flock($file_pointer, LOCK_UN);
  10. // 如果版本低於PHP4.0.2,20. 用3 取代LOCK_UN
  11. }
  12. fclose($file_pointer);
  13. print "數據成功寫入文件";
  14. ?>
複製代碼

Hmmm..., 對於追加資料與其他操作有點不同,就是FSEEK! 確認檔案指標在檔案尾部總是個好習慣。

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

FLOCK雜談:

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

關於模式: 'r' - 只讀方式打開, 文件指針置於文件頭 'r ' - 讀寫方式打開,檔案指標置於檔案頭 'w' - 只寫打開,文件指針置於文件頭, 文件被剪切為0字節, 如果文件不存在, 嘗試建立文件 'w ' - 讀寫打開,文件指針置於文件頭, 文件大小被剪切為0字節,如果文件不存在, 嘗試建立文件 'a' - 只寫方式打開,文件指針置於文件尾,如果文件不存在,嘗試建立文件 'a ' - 讀寫打開,檔案指標置於檔案尾,如果檔案不存在, 嘗試建立檔案

順便說一下建立檔案目錄的程式碼

  1. //建立類似"../../../xxx/xxx.txt"的目錄

  2. function createdirs($path, $mode = 0777) //mode 077
  3. {
  4. $dirs = explode('/',$path);
  5. $pos = strrpos($path, ".");
  6. if ($pos === false) { // note: three equal signs
  7. // not found, means path ends in a dir not file
  8. $subamount=0;
  9. }
  10. else {
  11. $subamount=1;
  12. }
  13. for ($c=0;$c $thispath="";

  14. for ($cc=0; $cc $thispath.=$dirs[$cc].'/';
  15. }
  16. if (!file_exists($thispath)) {
  17. //print "$thispath
  18. ";
  19. mkdir($thispath,$mode); //mkdir函數建立目錄
  20. }
  21. }
  22. }
  23. //呼叫如createdirs("xxx/xxxx/xxxx",);
  24. //原函數中使用$GLOBALS["dirseparator"]我改成了'/'

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

  26. {
  27. //$GLOBALS["dirseparator"]
  28. $dirs = explode($GLOBALS["dirseparator"],$path);
  29. $pos = strrpos($path, ".");
  30. if ($pos === false) { // note: three equal signs
  31. // not found, means path ends in a dir not file
  32. $subamount=0;
  33. }
  34. else {
  35. $subamount=1;
  36. }
複製程式碼

以上文章,供初學者參考,高手漂過。



相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板