目錄(資料夾)操作是 PHP 檔案系統處理的核心。本文系統整理 is_dir、mkdir、rmdir、realpath 等常用函式,並透過自訂函式 dir_writeable 示範「建立可寫目錄」與「測試目錄可寫性」的完整流程,附完整程式碼與執行結果說明。
| 函式 | 用途 | 回傳值 |
|---|---|---|
| is_dir($path) | 判斷路徑是否為目錄 | bool |
| mkdir($path, $mode=0777, $recursive=false, $context) | 建立目錄,支援遞迴建立 | bool |
| rmdir($path) | 刪除空目錄 | bool |
| realpath($path) | 回傳規範化絕對路徑(解析連結、相對路徑) | string|false |
| file_exists($path) | 檢查檔案/目錄是否存在 | bool |
| is_writable($path) | 判斷是否可寫 | bool |
function dir_writeable($dir) {
if (!is_dir($dir)) {
@mkdir($dir, 0777, true); // 遞迴建立
echo "目錄 {$dir} 建立成功!";
}
}
dir_writeable("test");
// 輸出:目錄 test 建立成功!
$dir = "test";
if (rmdir($dir)) {
echo "目錄 {$dir} 被成功刪除!";
} else {
echo "刪除目錄 {$dir} 時,出現錯誤!";
}
// 注意:rmdir 僅能刪除空目錄,非空目錄需先遞迴刪除內容
$path = "test.txt";
echo $path . "<br>"; // 相對路徑
$realpath = realpath($path);
echo $realpath; // 輸出絕對路徑,如 /var/www/html/test.txt
function dir_writeable($dir) {
// 1. 確保目錄存在
if (!is_dir($dir)) {
@mkdir($dir, 0777, true);
}
// 2. 嘗試建立暫存檔測試寫入權限
if (is_dir($dir)) {
$testFile = "{$dir}/test.txt";
if ($fp = @fopen($testFile, 'w')) {
@fclose($fp);
@unlink($testFile); // 清理測試檔
return 1; // 可寫
}
}
return 0; // 不可寫
}
// 使用
$writable = dir_writeable('./cache');
echo $writable ? "目錄可寫" : "目錄不可寫";
PHP 內建無單一函式刪除非空目錄,需自行遞迴:
function rrmdir($dir) {
if (!is_dir($dir)) return false;
$items = scandir($dir);
foreach ($items as $item) {
if ($item === '.' || $item === '..') continue;
$path = "{$dir}/{$item}";
is_dir($path) ? rrmdir($path) : unlink($path);
}
return rmdir($dir);
}
mkdir 的 $mode 受 umask 影響,實際權限為 $mode & ~umask。生產環境建議明確設定 0755 或 0775。mkdir 第三參數 $recursive=true 可一次建立多層目錄。@mkdir 會隱藏警告,建議改用 if (!mkdir(...)) { throw new Exception(...); } 明確處理。DIRECTORY_SEPARATOR 或 /(Windows 也支援),避免硬編碼 \。realpath 會解析符號連結,安全敏感場景需額外檢查 is_link。掌握 is_dir、mkdir、rmdir、realpath 等核心函式,並結合 fopen 測試實際寫入權限,能可靠地處理目錄建立、刪除、權限驗證等需求。實務上建議封裝為工具類(如 Filesystem::ensureDir()、Filesystem::isWritable()),統一錯誤處理與日誌記錄,提升程式碼維護性。