基於流的檔案 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");