fopen() 開啟檔案時,第二個參數指定模式,決定讀/寫/追加/建立/截斷/獨佔等行為。以下為 8 種標準模式完整對照。
| 模式 | 讀 | 寫 | 指標初始位置 | 檔案不存在 | 截斷現有內容 | 備註 |
|---|---|---|---|---|---|---|
r | ✅ | ❌ | 開頭 | 失敗 (FALSE) | ❌ | 唯讀開啟 |
r+ | ✅ | ✅ | 開頭 | 失敗 | ❌ | 讀寫開啟 |
w | ❌ | ✅ | 開頭 | 建立新檔 | ✅ 清空 | 唯寫,會清空檔案 |
w+ | ✅ | ✅ | 開頭 | 建立新檔 | ✅ 清空 | 讀寫,會清空檔案 |
a | ❌ | ✅ | 結尾 | 建立新檔 | ❌ | 追加寫入 |
a+ | ✅ | ✅ | 結尾 | 建立新檔 | ❌ | 追加讀寫 |
x | ❌ | ✅ | 開頭 | 建立新檔 | ❌ | 獨佔建立,檔案存在則失敗 |
x+ | ✅ | ✅ | 開頭 | 建立新檔 | ❌ | 獨佔建立讀寫,檔案存在則失敗 |
r 或 r+(需寫入時)。w(自動清空)。a 或 a+(指標自動在結尾,多程序追加安全)。x(如快取檔案首次建立)。在模式後加 b:rb, wb, ab, xb 等。Windows 下文字/二進位模式處理換行符不同(\r\n vs \n),建議統一使用二進位模式(rb, wb...)避免跨平台問題。
<?php
// 讀取整個檔案
$handle = fopen('data.txt', 'rb');
$content = stream_get_contents($handle);
fclose($handle);
// 追加寫入日誌
$handle = fopen('app.log', 'ab');
fwrite($handle, date('c') . " Message\n");
fclose($handle);
// 獨佔建立快取檔(避免並發重複產生)
$handle = fopen('cache/data.cache', 'xb');
if ($handle) {
fwrite($handle, $data);
fclose($handle);
} else {
// 檔案已存在,讀取現有快取
$data = file_get_contents('cache/data.cache');
}
?>