基於流的檔案 IO
開啟一個流
fopen 開啟一個檔案流控制代碼,可以使用各種函式進行讀取,寫入,搜尋和其他功能。此值為 resource 型別,不能傳遞給其他持久保留其功能的執行緒。
$f = fopen("errors.log", "a"); // Will try to open errors.log for writing
第二個引數是檔案流的模式:
| 模式 | 描述 |
|---|---|
r |
從只讀模式開啟,從檔案開頭開始 |
r+ |
從檔案的開頭開始進行讀寫 |
w |
從檔案的開頭開始只寫。如果該檔案存在,它將清空該檔案。如果它不存在,它將嘗試建立它。 |
w+ |
從檔案的開頭開始進行讀寫。如果該檔案存在,它將清空該檔案。如果它不存在,它將嘗試建立它。 |
a |
從檔案末尾開始,只開啟一個檔案進行寫入。如果該檔案不存在,它將嘗試建立它 |
a+ |
從檔案末尾開始開啟檔案進行讀寫。如果該檔案不存在,它將嘗試建立它 |
x |
建立並開啟一個僅供寫入的檔案。如果該檔案存在,則 fopen 呼叫將失敗 |
x+ |
建立並開啟一個檔案進行讀寫。如果該檔案存在,則 fopen 呼叫將失敗 |
c |
開啟檔案只寫。如果該檔案不存在,它將嘗試建立它。它將在檔案開頭寫入,但在寫入之前不會清空檔案 |
c+ |
開啟檔案進行讀寫。如果該檔案不存在,它將嘗試建立它。它將在檔案開頭寫入,但在寫入之前不會清空檔案 |
在 Windows 中新增 t(例如 a+b,wt 等)將在處理檔案時將 \n 行結尾轉換為 \r\n。如果不是這樣的話,在模式後新增 b,特別是如果它是二進位制檔案。
當 PHP 應用程式不再用於防止 Too many open files 錯誤時,應該使用 fclose 關閉流。這在 CLI 程式中尤其重要,因為只有在執行時關閉時才關閉流 - 這意味著在 Web 伺服器中,可能沒有必要** (但仍然應該,作為防止資源洩漏的做法)關閉流如果你不希望這個程序執行很長時間,並且不會開啟很多流。
讀
使用 fread 將從檔案指標讀取給定的位元組數,或者直到滿足 EOF。
閱讀線
使用 fgets 將讀取檔案,直到達到 EOL 或讀取給定長度。
讀剩下的一切
使用 stream_get_contents 將流中的所有剩餘位元組轉換為字串並返回它。
調整檔案指標位置
最初在開啟流之後,檔案指標位於檔案的開頭(或者如果使用模式 a 則結束)。使用 fseek 函式將檔案指標移動到相對於三個值之一的新位置:
SEEK_SET:這是預設值; 檔案位置偏移量將相對於檔案的開頭。SEEK_CUR:檔案位置偏移量將相對於當前位置。SEEK_END:檔案位置偏移量將相對於檔案末尾。傳遞負偏移量是該值的最常見用途; 它會在檔案結束前將檔案位置移動到指定的位元組數。
rewind 是 fseek($fh, 0, SEEK_SET) 的便捷捷徑。
使用 ftell 將顯示檔案指標的絕對位置。
例如,以下指令碼讀取跳過前 10 個位元組,讀取下 10 個位元組,跳過 10 個位元組,讀取接下來的 10 個位元組,然後讀取 file.txt 中的最後 10 個位元組:
$fh = fopen("file.txt", "rb");
fseek($fh, 10); // start at offset 10
echo fread($fh, 10); // reads 10 bytes
fseek($fh, 10, SEEK_CUR); // skip 10 bytes
echo fread($fh, 10); // read 10 bytes
fseek($fh, -10, SEEK_END); // skip to 10 bytes before EOF
echo fread($fh, 10); // read 10 bytes
fclose($fh);
寫作
使用 fwrite 將提供的字串寫入從當前檔案指標開始的檔案。
fwrite($fh, "Some text here\n");