文件系統操作是 CMS、網盤、日誌系統等應用的核心功能。PHP 提供豐富的文件/目錄 API,但參數細節、版本差異、錯誤處理常讓開發者踩坑。本文系統整理核心函數並給出最佳實踐封裝。
opendir/readdir/closedir 經典三部曲$base_dir = "filelist/";
$handle = opendir($base_dir);
while (false !== ($entry = readdir($handle))) {
echo $entry . "\n";
}
closedir($handle);
注意:返回 . 和 .. 需自行過濾。
DirectoryIterator (PHP 5+)$dir = new DirectoryIterator("/etc/php5");
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) echo $fileinfo->getFilename() . "\n";
}
更符合現代風格,自動過濾 . ..,支持 SPL 迭代器鏈。
dirname() basename() pathinfo()$path = "/var/www/index.php";
echo dirname($path); // /var/www
echo basename($path); // index.php
print_r(pathinfo($path)); // ['dirname','basename','extension','filename']
disk_free_space() disk_total_space()mkdir() rmdir()mkdir("path/to/dir", 0755, true); // 遞歸創建,權限受 umask 影響
rmdir("path/to/dir"); // 僅能刪除空目錄
前置檢查:is_readable($file) 同時驗證存在性與權限,優於單純 file_exists()。
整文件讀取:
file_get_contents($file),內存映射極快。$h=fopen($file,'r'); $data=fread($h,filesize($file)); fclose($h);implode('', file($file))。前置檢查:is_writable($file)。
整文件寫入:
file_put_contents($file, $data),支持 FILE_APPEND、LOCK_EX 旗標。$h=fopen($file,'w'); fwrite($h,$data); fclose($h);併發安全寫入(帶鎖):
function cache_page($path, $data) {
if (!$fp = fopen($path, 'w')) return false;
if (!flock($fp, LOCK_EX)) { fclose($fp); return false; }
if (!fwrite($fp, $data)) { flock($fp, LOCK_UN); fclose($fp); return false; }
flock($fp, LOCK_UN);
fclose($fp);
return true;
}
unlink($file); // 刪除
copy($src, $dest); // 複製,目標目錄需可寫
rename($old, $new); // 重命名/移動,跨分區可能失敗
| 需求 | 函數 | 返回值 |
|---|---|---|
| 修改時間 | filemtime() | Unix 時間戳 |
| 訪問時間 | fileatime() | Unix 時間戳 |
| 狀態變更時間 | filectime() | Unix 時間戳 |
| 所有者 UID | fileowner() | 整數 UID,配合 posix_getpwuid() 解析用戶名 |
| 權限 | fileperms() | 整數,用 substr(sprintf('%o', $perms), -4) 取八進制 |
| 大小(字節) | filesize() | 整數 |
| 完整屬性 | stat() | 關鍵鍵名數組 |
DIRECTORY_SEPARATOR 或 realpath() 規範化,避免跨平台問題。fread/fwrite 循環),避免內存溢出。0755,文件 0644,敏感配置 0600。熟練掌握上述 API 並封裝為專案通用的 FileSystem 工具類,是 PHP 後端工程師的基本功。