PHP 提供超過 80 個檔案系統函式,涵蓋路徑解析、讀寫、權限、鎖定、串流、目錄操作等。雖然常用的只有 20 左右,但理解分類脈絡能在遇到罕見需求(如跨平台路徑、串流過濾、inode 操作)時快速定位解法。本文將函式按功能域分類,並標註高頻實戰組合。
| 功能域 | 代表函式 | 核心用途 |
|---|---|---|
| 路徑解析 | basename, dirname, pathinfo, realpath |
拆解/組合路徑、取得標準絕對路徑 |
| 存在性與型別檢查 | file_exists, is_file, is_dir, is_link, is_readable, is_writable, is_executable |
條件判斷前的安全檢查 |
| 資訊取得 | filesize, filemtime, fileatime, filectime, fileperms, fileowner, filegroup, filetype, stat, lstat |
建立檔案清單、快取驗證、權限稽核 |
| 讀取操作 | file_get_contents, file, fopen+fread, fgets, fgetcsv, readfile |
小檔案全讀、大檔案串流、CSV 解析、直接輸出 |
| 寫入操作 | file_put_contents, fopen+fwrite, fputcsv, ftruncate |
原子寫入、追加模式、CSV 匯出、截斷 |
| 目錄操作 | mkdir, rmdir, scandir, glob, opendir+readdir |
建立/刪除目錄、列舉檔案、模式匹配 |
| 複製/移動/刪除 | copy, rename, unlink, move_uploaded_file |
檔案生命週期管理 |
| 權限與擁有者 | chmod, chown, chgrp, umask |
安全強化、多使用者環境協作 |
| 連結與掛載 | link, symlink, readlink, linkinfo |
硬連結/符號連結建立與解析 |
| 串流與鎖定 | flock, fseek, ftell, rewind, fflush, popen, pclose |
併發控制、大檔案隨機存取、程序通訊 |
| 特殊檔案 | tempnam, tmpfile, touch, parse_ini_file |
暫存檔、時間戳更新、設定檔解析 |
| 磁碟空間 | disk_free_space, disk_total_space |
容量監控、上傳前預檢 |
$filename = basename($_FILES['upfile']['name']); // 僅保留檔名
$dest = '/var/www/uploads/' . $filename;
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $dest)) {
// 成功
}
$handle = fopen('huge.log', 'r');
while (!feof($handle)) {
$chunk = fread($handle, 8192); // 8KB 緩衝
process($chunk);
}
fclose($handle);
$tmp = tempnam(sys_get_temp_dir(), 'app_');
file_put_contents($tmp, $data);
rename($tmp, $target); // 同檔案系統下 rename 為原子操作
function rcopy($src, $dst) {
$dir = opendir($src);
@mkdir($dst);
while (($file = readdir($dir)) !== false) {
if ($file === '.' || $file === '..') continue;
$srcPath = $src . '/' . $file;
$dstPath = $dst . '/' . $file;
is_dir($srcPath) ? rcopy($srcPath, $dstPath) : copy($srcPath, $dstPath);
}
closedir($dir);
}
chown/chgrp/lchown 僅 Unix 有效。symlink Windows 需管理員權限或開發者模式(Vista+)。/,輸出給 Shell 時請用 DIRECTORY_SEPARATOR。clearstatcache() 在同腳本多次 file_exists/filesize 之間必呼叫,否則讀到快取舊值。WP 核心大量使用 dirname(__FILE__)(PHP 5.3+ 建議改 __DIR__)建構絕對路徑,確保檔案包含不受執行目錄影響。這是「路徑解析」類函式在大型專案中的教科書級應用。
檔案函式雖多,但核心場景集中在「讀、寫、查、刪、權、目錄」。建立分類心智模型,配合 SplFileObject 物件導向封裝(PHP 5.1+),即能優雅處理 95% 的檔案操作需求。