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

PHP rmdir() 刪除目錄:基本用法與遞歸刪除非空目錄

     編輯:PHP 相關知識

PHP rmdir() 刪除目錄完整指南

`rmdir()` 僅能刪除**空目錄**。本文說明基本用法、判斷目錄存在、遞歸刪除非空目錄完整實作、權限問題與最佳實踐。

基本語法

bool rmdir ( string $dirname [, resource $context ] )

成功返回 `true`,失敗返回 `false`(目錄不存在、非空、權限不足)。

基本範例

<?php
$dir = 'exampledir';

if (!is_dir($dir)) {
    mkdir($dir); // 建立測試用
    echo "目錄已建立\n";
}

if (rmdir($dir)) {
    echo "目錄刪除成功\n";
} else {
    echo "刪除失敗:目錄不存在、非空或無權限\n";
}
?>

遞歸刪除非空目錄完整實作

<?php
/**
 * 遞歸刪除目錄及其所有內容
 * @param string $dir 目錄路徑
 * @return bool 是否成功
 */
function deleteDirectory($dir) {
    if (!is_dir($dir)) {
        return false;
    }
    
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        
        if (is_dir($path)) {
            deleteDirectory($path); // 遞歸刪除子目錄
        } else {
            if (!unlink($path)) { // 刪除檔案
                return false;
            }
        }
    }
    
    return rmdir($dir); // 最後刪除空目錄
}

// 使用
$targetDir = './fakeDir';
if (deleteDirectory($targetDir)) {
    echo "目錄及內容已完全刪除\n";
} else {
    echo "刪除過程中發生錯誤\n";
}
?>

進階:使用 SPL 迭代器(更簡潔)

function deleteDirectorySpl($dir) {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST // 先刪除子項
    );
    
    foreach ($iterator as $item) {
        if ($item->isDir()) {
            rmdir($item->getPathname());
        } else {
            unlink($item->getPathname());
        }
    }
    rmdir($dir);
}

權限與常見錯誤

錯誤原因解決
Permission deniedPHP 進程無寫入權限確認目錄擁有者/群組、chmod 755、SELinux/AppArmor
Directory not empty直接對非空目錄調用 rmdir使用遞歸刪除函數
No such file or directory路徑錯誤或已被刪除先 `is_dir()` 判斷
Device or resource busy目錄被其他進程鎖定關閉佔用程式、lsof 排查

最佳實踐建議

  1. 刪除前務必 `is_dir()` 確認存在。
  2. 生產環境建議先移動到臨時目錄(`rename()`),確認無誤再刪除。
  3. 大量檔案刪除考慮分批、異步處理,避免阻塞請求。
  4. 記錄刪除日誌(路徑、時間、操作者)供審計。
  5. Windows 下路徑分隔符用 `DIRECTORY_SEPARATOR` 保證相容。

掌握 `rmdir` 限制與遞歸刪除模式,能安全處理各類目錄清理需求。

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