這段時間接觸了挺多檔案操作,沒有時間進行總結,現在有點空閑就根據自己的瞭解歸納一下流程吧。
1、開啟檔案
要在PHP中開啟一個檔案,可以使用fopen()函數。這個時候我們還需要指定如何使用它,這就是檔案模式。
1.1、選擇檔案模式
從本質上,檔案模式可以告訴作業系統一種機制,這種機制可以決定如何處理來自其他人或指令碼的訪問請求,以及一種用來檢查你是否有權訪問這個特定檔案的方法。
當開啟一個檔案的時候,有以下3種選擇:
1)開啟檔案為了唯讀,唯寫或者讀和寫。
2)如果要寫一個檔案,可能是希望覆蓋所有已有的檔案內容,或者僅僅將新資料追加到檔案末尾。如果該檔案已經存在,也可以終止程式的執行而不是覆蓋該檔案。
3)如果希望在一個區分了二進位方式和純文字方式的系統上寫一個檔案,還必須指定採用的方式。
其中,函數fopen()支援以上3種方式的組合。
1.2、使用fopen()開啟檔案
$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'w');
調用fopen()的時候,需要傳遞2個、3個或4個參數。通常使用2個參數。
注意:在UNIX環境下,目錄中的間隔符是正斜線(/)。如果使用的是Windows平台,可以使用正斜線或者反斜線。如果使用反斜線,就必須使用轉義,這樣函數才可以正確理解這些字元。一般我們還是使用正斜線,這樣代碼不需要任何修改就可以在WINDOWS和UNIX機器上運行。
fopen()函數的第二個參數是檔案模式,它是一個字串,指定了將對檔案的操作。
fopen()函數的檔案模式總結如下表:
| 模式 |
模式名稱 |
意義 |
| r |
唯讀 |
讀模式—開啟檔案,從檔案頭開始讀 |
| r+ |
唯讀 |
讀寫入模式—開啟檔案,從檔案頭開始讀寫 |
| w |
唯寫 |
寫入模式—開啟檔案,從檔案頭開始讀。如果該檔案已經存在,將刪除所有檔案已有內容。如果該檔案不存在,函數將建立這個檔案 |
| w+ |
唯寫 |
寫入模式—開啟檔案,從檔案頭開始讀寫。如果該檔案已經存在,將刪除所有檔案已有內容。如果該檔案不存在,函數將建立這個檔案 |
| x |
謹慎寫 |
寫入模式開啟檔案,從檔案頭開始寫。如果檔案已經存在,該檔案將不會被開啟,fopen()函數返回false,而且PHP將產生一個警告 |
| x+ |
謹慎寫 |
寫/讀模式開啟檔案,從檔案頭開始寫。如果檔案已經存在,該檔案將不會被開啟,fopen()函數將返回false,而且PHP將產生一個警告 |
| a |
追加 |
追加模式—開啟檔案,如果該檔案已有內容,將從檔案末尾開始追加(寫),如果該檔案不存在,函數將建立這個檔案。 |
| a+ |
追加 |
追加模式—開啟檔案,如果該檔案已有內容,將從檔案末尾開始追加(寫)或者讀,如果該檔案不存在,函數將建立這個檔案 |
| b |
二進位 |
二進位模式—用於與其他模式進行串連。如果檔案系統能夠區分二進位檔案和文字檔。推薦一直使用這個選項以獲得最大程度的可移植性 |
| t |
文本 |
用於與其他模式的結合。不是推薦選項 |
fopen()函數的第3個參數是可選的。如果要在include_path中搜尋一個檔案,就可以使用它。如果希望進行進行這個操作,可以將這個參數設定為1.
第4個參數也是可選的.fopen()函數允許檔案名稱以協議名稱開始,並且在一個遠端位置開啟檔案。
如果fopen()成功開啟一個檔案,該函數將返回一個指向這個檔案的檔案指標。我們就是通過這個檔案指標來操作這個檔案的。
2、寫檔案
在PHP中可以使用fwrite()或者fputs()來寫檔案。調用方式如下:
fwrite($fp, $outputstring);
這個函數告訴PHP將儲存在$outputstring中的字串寫入到$fp指向的檔案中。
2.1、fwrite()的參數
fwrite()的原型如下所示:
int fwrite(resource handle, string string [, int length])
其中第3個參數length是寫入的最大字元數。
2.2、檔案格式
3、關閉檔案
當使用完檔案後,應該將其關閉。調用fclose()函數:
fclose($fp);
如果該檔案被成功關閉,函數將返回一個true值。反之,該函數將返回false。
4、讀檔案
4.1、以唯讀模式開啟檔案:fopen()
仍然使用fopen()函數開啟檔案。以唯讀模式開啟檔案,故使用了"rb"檔案模式。
4.2、知道何時讀完檔案:feof()
使用feof()函數作為檔案結束的測試條件:
while(!feof($fp))
函數feof()的唯一參數是檔案指標。如果該檔案指標指向了檔案末尾,它將返回true。
4.3、每次讀取一行資料:fgets()、fgetss()和fgetcsv()
1)使用fgets()函數來讀取檔案內容:$order = fgets($fp, 999);
2)fgets()函數的一個變體是fgetss()函數,其原型:string fgetss(resource fp, int length, string [allowable_tags]);
它可以過濾字串中包含的PHP和HTML標記。
3)fgetscv()函數是fgets()的另一個變體。其原型:array fgetscv(resource fp, int length [, string delimiter [, string enclosure]])
當檔案中使用了定界符時,可以使用該函數將文本分成多行。
4.4、讀取整個檔案:readfile()、fpassthru()和file()4.5、讀取一個字元:fgetc()4.6、讀取任意長度:fread()
函數原型:string fread(resource fp, int length);
5、使用其他有用的檔案函數
5.1、查看檔案是否存在:file_exists()5.2、確定檔案大小:filesize()5.3、刪除一個檔案:unlink()5.4、在檔案中定位:rewind()、fssek()和ftell()
6、檔案鎖定
在PHP中,檔案鎖定是通過flock()函數來實現的。當一個檔案被開啟並且在進行讀寫操作之前,應該調用這個函數。這個函數的原型如下:
bool flock(resource fp, int operation [, int &wouldblock])
注意:flock()函數無法在NFS或其他網路檔案系統中使用。