基於流的檔案 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+bwt 等)將在處理檔案時將 \n 行結尾轉換為 \r\n。如果不是這樣的話,在模式後新增 b,特別是如果它是二進位制檔案。

當 PHP 應用程式不再用於防止 Too many open files 錯誤時,應該使用 fclose 關閉流。這在 CLI 程式中尤其重要,因為只有在執行時關閉時才關閉流 - 這意味著在 Web 伺服器中,可能沒有必要** (但仍然應該,作為防止資源洩漏的做法)關閉流如果你不希望這個程序執行很長時間,並且不會開啟很多流。

使用 fread 將從檔案指標讀取給定的位元組數,或者直到滿足 EOF。

閱讀線

使用 fgets 將讀取檔案,直到達到 EOL 或讀取給定長度。

無論 freadfgets 在閱讀將移動檔案指標。

讀剩下的一切

使用 stream_get_contents 將流中的所有剩餘位元組轉換為字串並返回它。

調整檔案指標位置

最初在開啟流之後,檔案指標位於檔案的開頭(或者如果使用模式 a 則結束)。使用 fseek 函式將檔案指標移動到相對於三個值之一的新位置:

  • SEEK_SET:這是預設值; 檔案位置偏移量將相對於檔案的開頭。
  • SEEK_CUR:檔案位置偏移量將相對於當前位置。
  • SEEK_END:檔案位置偏移量將相對於檔案末尾。傳遞負偏移量是該值的最常見用途; 它會在檔案結束前將檔案位置移動到指定的位元組數。

rewindfseek($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");