PHP 提供豐富的檔案系統函數,但開發過程中常遇到權限、編碼、路徑等問題。本文整理實務上最常見的問答,涵蓋建立、讀取、寫入、權限、屬性取得、鎖定與刪除等操作。
A: 兩種主要方式:
// 方式一:fopen(推薦,可控制模式)
$fp = fopen("newfile.txt", "w"); // w: 寫入,截短現有內容
fclose($fp);
// 方式二:系統指令(不推薦,有安全風險)
exec("touch newfile.txt"); // Linux/Unix
// 或
file_put_contents("newfile.txt", ""); // PHP 5.4+ 簡潔寫法
A: 常見三大原因:
fopen 需使用 w、w+、a、a+ 等寫入模式__DIR__ 組合絕對路徑A: file() 函數自動按行分割,回傳陣列:
$lines = file("data.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
A: 視 PHP 版本選擇:
// PHP 4.3.0+ 推薦
$content = file_get_contents("data.txt");
// 舊版相容寫法
$fp = fopen("data.txt", "r");
$content = fread($fp, filesize("data.txt"));
fclose($fp);
A: 使用 file_exists()。不要用 fopen() 判斷,因為權限不足時 fopen 會失敗導致誤判。
A: 確認兩點:
r 模式開啟遠端 URLphp.ini 啟用 allow_url_fopen = OnA: PHP 提供完整函數族群:
| 函數 | 說明 |
|---|---|
| filemtime() | 最後修改時間 |
| fileatime() | 最後存取時間 |
| filectime() | inode 變更時間 |
| filesize() | 檔案大小(位元組) |
| fileowner() | 擁有者 UID |
| filegroup() | 群組 GID |
| fileperms() | 權限位元遮罩 |
| filetype() | 類型(file/dir/link 等) |
A: 可以。fseek($fp, $offset, SEEK_SET) 支援 SEEK_SET(開頭)、SEEK_CUR(目前位置)、SEEK_END(結尾)三種基準點。
A: 使用 flock():
$fp = fopen("data.txt", "c+");
if (flock($fp, LOCK_EX)) { // 獨佔鎖定
// 安全讀寫操作
flock($fp, LOCK_UN); // 釋放鎖定
}
fclose($fp);
注意:flock() 僅在同一系統進程間有效,分散式系統需用 Redis 鎖或資料庫行鎖。
A: PHP 無內建函數,需組合處理:
function deleteLine($filename, $lineNum) {
$lines = file($filename, FILE_IGNORE_NEW_LINES);
if ($lineNum > 0 && $lineNum <= count($lines)) {
unset($lines[$lineNum - 1]);
file_put_contents($filename, implode("\n", $lines));
return true;
}
return false;
}
// 刪除第 3 行
deleteLine("test.dat", 3);
\,Linux 用 /,建議統一用 DIRECTORY_SEPARATOR 或 /(PHP 自動轉換)iconv() 轉換file_get_contents() 讀入記憶體,改用 fopen() 串流逐塊處理@fopen(),應檢查回傳值並記錄錯誤日誌fclose(),長期執行腳本否則會洩漏檔案描述符掌握這些檔案操作核心概念,能讓你在處理上傳、匯入匯出、日誌、快取等場景時更得心應手。