首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 目錄操作函式實戰:建立、刪除、判斷、權限檢查、路徑正規化

     編輯:PHP 相關知識

前言

目錄(資料夾)操作是 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

範例 1:自動建立目錄

function dir_writeable($dir) {
    if (!is_dir($dir)) {
        @mkdir($dir, 0777, true); // 遞迴建立
        echo "目錄 {$dir} 建立成功!";
    }
}
dir_writeable("test");
// 輸出:目錄 test 建立成功!

範例 2:刪除目錄

$dir = "test";
if (rmdir($dir)) {
    echo "目錄 {$dir} 被成功刪除!";
} else {
    echo "刪除目錄 {$dir} 時,出現錯誤!";
}
// 注意:rmdir 僅能刪除空目錄,非空目錄需先遞迴刪除內容

範例 3:路徑正規化

$path = "test.txt";
echo $path . "<br>";           // 相對路徑
$realpath = realpath($path);
echo $realpath;                 // 輸出絕對路徑,如 /var/www/html/test.txt

範例 4:完整的目錄可寫性測試與建立

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。
  • 遞迴建立:PHP 5.0+ mkdir 第三參數 $recursive=true 可一次建立多層目錄。
  • 錯誤抑制:@mkdir 會隱藏警告,建議改用 if (!mkdir(...)) { throw new Exception(...); } 明確處理。
  • 路徑分隔符:使用 DIRECTORY_SEPARATOR 或 /(Windows 也支援),避免硬編碼 \。
  • Symlink 攻擊:realpath 會解析符號連結,安全敏感場景需額外檢查 is_link。

總結

掌握 is_dir、mkdir、rmdir、realpath 等核心函式,並結合 fopen 測試實際寫入權限,能可靠地處理目錄建立、刪除、權限驗證等需求。實務上建議封裝為工具類(如 Filesystem::ensureDir()、Filesystem::isWritable()),統一錯誤處理與日誌記錄,提升程式碼維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved