-
-
// 注意在4.0.0-RC2 之前不存在!== 運算子
if ($handle = opendir('/path/to/files')) {
- echo "Directory handle: $handlen";
- echo "Files:n";
- while (false !== ($file = readdir($handle))) {
- echo "$filen";
- }
- while ($file = readdir($handle )) {
- echo "$filen";
- }
closedir($handle);
- }
- ?>
-
複製程式碼
讀取檔案:
-
-
$file_name = "data.dat";
- // 要讀取的檔案的絕對路徑: homedata.dat: homedata.dat
- $file_pointer = fopen($file_name, "r");
- // 開啟文件,8. "r" 是一種模式,9. 或者說我們要進行的操作方法,10. 詳見本文後面的介紹
- $file_read = fread($file_pointer, filesize($file_name));
- // 透過檔案指14. 針讀取檔案內容
- fclose($file_pointer);
- //關閉檔案
- print "讀取的檔案內容是: $file_read";
- // 顯示檔案內容
- ?>
複製程式碼
複製程式碼
寫文件:
-
-
-
-
-
-
$file_name = "data.dat";
- // 絕對路徑: homedata.dat
- $file_pointer = $file_pointer = $file_pointer = $file_pointer = fopen($file_name, "w");
- // "w"是一種模式,8. 詳見後面
- fwrite($file_pointer, "what you wanna write");
- // 先把檔案剪下12. 0位元組大小,13. 然後寫入
fclose($file_pointer); // 結束 print "資料成功寫入檔案"; ?>
複製程式碼
追加到檔案後面:
-
-
-
-
-
-
$file_name = "data.dat";
- // 絕對路徑: homedata.dat
$file_pointer = fopen($file_name, "a");
- // "w"模式
- fwrite($file_pointer, "what you wanna append");
- // 不11. 把檔案剪下12. 成0字節,13. 把資料追加到檔案最後
- 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,9. 所以用LOCK_SH,10. 你可能需要直接寫成1.
- if ($lock) {
- $file_read = fread($file_pointer, filesize($file_name));
- $lock = flock($file_pointer, LOCK_UN);
- // 若版本小於PHP4.0.2,17. 以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,9. 用2 代替LOCK_EX
- if ($lock) {
- fwrite($file_pointer, " what u wanna write");
- flock($file_pointer, LOCK_UN);
- // 如果版本低於PHP4.0.2,16. 用3 代替LOCK_UN
- }
fclose($file_pointer); print "資料成功寫入檔案"; ?> 複製程式碼
雖然"w"模式用來覆蓋文件, 單我覺得不適用。
-
-
$file_name = "data.dat";
- $file_pointer = fopen($file_name, "a");
- $lock = flock($file_pointer, LOCK_EX);
- // 如果版本低於PHP4.0.2,9. 用2 代替LOCK_EX
if ( $lock) {
- fseek($file_pointer, 0, SEEK_END);
- // 如果版本小於PHP4.0RC1,15. 使用fseek($file_pointer, filsize($file_name));
fwrite($file_pointer, "what u wanna write");
- flock($file_pointer, LOCK_UN);
- // 如果版本低於PHP4.0.2,20. 用3 取代LOCK_UN
- }
- fclose($file_pointer);
- print "數據成功寫入文件";
- ?>
-
複製代碼
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 $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;
- }
-
-
複製程式碼
以上文章,供初學者參考,高手漂過。
|