| 模式 | 說明 | 指標位置 | 截斷檔案 | 建立新檔 | 讀/寫 |
|---|---|---|---|---|---|
r | 唯讀 | 檔頭 | 否 | 否 | 讀 |
r+ | 讀寫 | 檔頭 | 否 | 否 | 讀/寫 |
w | 唯寫 | 檔頭 | 是 | 是 | 寫 |
w+ | 讀寫 | 檔頭 | 是 | 是 | 讀/寫 |
a | 唯寫(追加) | 檔尾 | 否 | 是 | 寫 |
a+ | 讀寫(追加) | 檔尾 | 否 | 是 | 讀/寫 |
x | 建立唯寫 | 檔頭 | 否 | 獨佔 | 寫 |
x+ | 建立讀寫 | 檔頭 | 否 | 獨佔 | 讀/寫 |
x/x+:檔案已存在時失敗回傳 false(原子性建立,避免競態條件)。
$filename = 'demo.txt';
$content = "Welcome to PHP File Operations!\n";
// 1. 開啟檔案(w+:讀寫、建立、截斷)
$fp = fopen($filename, 'w+');
if (!$fp) {
die("無法開啟/建立檔案: $filename");
}
// 2. 寫入資料
if (fwrite($fp, $content) === false) {
die("寫入失敗");
}
echo "寫入成功\n";
// 3. 關閉檔案
fclose($fp);
// 覆蓋模式 (w)
$fp = fopen('log.txt', 'w');
fwrite($fp, "第一行\n");
fclose($fp);
$fp = fopen('log.txt', 'w'); // 再次以 w 開啟,內容被清空
fwrite($fp, "第二行(覆蓋)\n");
fclose($fp);
// log.txt 內容:第二行(覆蓋)
// 追加模式 (a)
$fp = fopen('log.txt', 'a');
fwrite($fp, "第三行(追加)\n");
fclose($fp);
// log.txt 內容:
// 第二行(覆蓋)
// 第三行(追加)
<?php
$txtFile = "Demo.txt";
// 以 w+ 開啟:讀寫、建立、截斷
if (($fp = fopen($txtFile, "w+")) === false) {
die("建立檔案失敗: $txtFile");
}
echo "建立檔案成功
";
$str = "Welcome To ItCodeWorld!";
if (!fwrite($fp, $str)) {
die("寫入失敗");
}
echo "寫入成功: $str
";
fclose($fp);
// 驗證讀取
$content = file_get_contents($txtFile);
echo "檔案內容: " . htmlspecialchars($content);
?>
| 系統 | 換行符 | ASCII | PHP 常數 |
|---|---|---|---|
| Windows | \r\n (CRLF) | 13, 10 | PHP_EOL |
| Linux/macOS | \n (LF) | 10 | PHP_EOL |
| Mac OS 9 以前 | \r (CR) | 13 | - |
建議使用 PHP_EOL 常數自動適應平台:
fwrite($fp, "第一行" . PHP_EOL); fwrite($fp, "第二行" . PHP_EOL);
$fp = fopen('counter.txt', 'c+'); // c: 不截斷、建立、指標在開頭
if (flock($fp, LOCK_EX)) { // 獨佔鎖
$count = (int)fread($fp, filesize('counter.txt'));
$count++;
ftruncate($fp, 0); // 清空內容
rewind($fp); // 指標回開頭
fwrite($fp, (string)$count);
fflush($fp); // 強制寫入磁碟
flock($fp, LOCK_UN); // 釋放鎖
}
fclose($fp);
| 函數 | 用途 |
|---|---|
file_get_contents() | 一次讀取整個檔案為字串 |
file_put_contents() | 一次寫入字串到檔案(支援 FILE_APPEND、LOCK_EX) |
file() | 讀取檔案為陣列(每行一元素) |
fgets() | 逐行讀取 |
fread() | 讀取指定長度 |
fwrite() / fputs() | 寫入 |
fseek() / rewind() | 移動指標 |
ftell() | 取得指標位置 |
feof() | 判斷是否到檔尾 |
filesize() | 取得檔案大小 |
unlink() | 刪除檔案 |
rename() | 重命名/移動 |
copy() | 複製檔案 |
file_exists() / is_file() / is_dir() | 檢查存在性 |
// 覆蓋寫入
file_put_contents('data.txt', $content);
// 追加寫入(鎖定檔案防併發)
file_put_contents('log.txt', $newLine . PHP_EOL, FILE_APPEND | LOCK_EX);
// 讀取整個檔案
$content = file_get_contents('data.txt');
掌握 fopen() 模式差異、換行符跨平台處理、檔案鎖定併發控制,是 PHP 檔案操作的核心功力。日常開發優先使用 file_get_contents()/file_put_contents() 簡化程式碼。