在php不不管讀取什麼類型的檔案多半是使用fopen函數,然後配合其它的函數再進行操作,下面我來介紹讀取dat資料檔案的方法。
以下是一篇關於檔案基本讀寫操作的文章,我曾經就是看了這篇文章後學會檔案基本操作的,在這裡發出來與大家共用: 複製內容到剪貼簿
| 代碼如下 |
複製代碼 |
$file_name = "data.dat"; // 要讀取的檔案的絕對路徑: homedata.dat $file_pointer = fopen($file_name, "r"); // 開啟檔案,"r" 是一種模式,或者說我們要進行的操作方法,詳見本文後面的介紹 $file_read = fread($file_pointer, filesize($file_name)); // 通過檔案指標讀取檔案內容 fclose($file_pointer); // 關閉檔案 print "讀取到的檔案內容是: $file_read"; // 顯示檔案內容 ?> |
代碼:
| 代碼如下 |
複製代碼 |
$file_name = "data.dat"; // 絕對路徑: homedata.dat $file_pointer = fopen($file_name, "w"); // "w"是一種模式,詳見後面 fwrite($file_pointer, "what you wanna write"); // 先把檔案剪下為0位元組大小, 然後寫入 fclose($file_pointer); // 結束 print "資料成功寫入檔案"; ?> |
代碼:
| 代碼如下 |
複製代碼 |
$file_name = "data.dat"; // 絕對路徑: homedata.dat $file_pointer = fopen($file_name, "a"); // "w"模式 fwrite($file_pointer, "what you wanna append"); // 不把檔案剪下成0位元組, 把資料追加到檔案最後 fclose($file_pointer); // 結束 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',引起檔案破壞。
我們當然不希望發生這樣的情況, 所以讓我們看看檔案鎖定: 複製內容到剪貼簿
代碼:
| 代碼如下 |
複製代碼 |
$file_name = "data.dat"; $file_pointer = fopen($file_name, "r"); $lock = flock($file_pointer, LOCK_SH); // 我使用4.0.2,所以用LOCK_SH,你可能需要直接寫成 1. if ($lock) { $file_read = fread($file_pointer, filesize($file_name)); $lock = flock($file_pointer, LOCK_UN); // 如果版本小於PHP4.0.2, 用 3 代替 LOCK_UN } fclose($file_pointer); |
print "檔案內容為 $file_read";
?>上例中,如果兩個檔案read.php和read2.php都要存取該檔案,那麼它們都可以讀取,但是當一個程式需要寫入的時候,它必須等待,直到讀操作完成,檔案所釋放。 複製內容到剪貼簿
代碼:
| 代碼如下 |
複製代碼 |
$file_name = "data.dat"; $file_pointer = fopen($file_name, "w"); $lock = flock($file_pointer, LOCK_EX); // 如果版本低於PHP4.0.2, 用 2 代替 LOCK_EX if ($lock) { fwrite($file_pointer, "what u wanna write"); flock($file_pointer, LOCK_UN); // 如果版本低於PHP4.0.2, 用 3 代替 LOCK_UN } fclose($file_pointer); print "資料成功寫入檔案"; ?> |
Hmmm..., 對於追加資料與其他動作有點不同,就是FSEEK! 確認檔案指標在檔案尾部總是一個好習慣。
如果是在Windows系統下, 上面的檔案中檔案名稱前面需要加上''.
FLOCK雜談:
Flock()只在檔案開啟後才鎖定。 在上列中檔案開啟後才獲得鎖定,現在檔案的內容只是在當時的內容, 而不反映出別的程式操作的結果,因此不只是在檔案追加操作,就是對讀取操作也應該使用fseek。
(此處翻譯可能不是很確切, 但我想意思到了)。
關於模式:
'r' - 唯讀方式開啟, 檔案指標置於檔案頭
'r+' - 讀寫方式開啟,檔案指標置於檔案頭
'w' - 唯寫開啟,檔案指標置於檔案頭, 檔案被剪下為0位元組, 如果檔案不存在, 嘗試建立檔案
'w+' - 讀寫開啟,檔案指標置於檔案頭, 檔案大小被剪下為0位元組,如果檔案不存在, 嘗試建立檔案
'a' - 唯寫方式開啟,檔案指標置於檔案尾,如果檔案不存在,嘗試建立檔案
'a+' - 讀寫開啟,檔案指標置於檔案尾,如果檔案不存在, 嘗試建立檔案
http://www.bkjia.com/PHPjc/629904.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/629904.htmlTechArticle在php不不管讀取什麼類型的檔案多半是使用fopen函數,然後配合其它的函數再進行操作,下面我來介紹讀取dat資料檔案的方法。 以下是一篇...