红穆笔记
首頁 語言筆記 php 刪除當前目錄下的所有文件以及文件夾
語言筆記 PHP

php 刪除當前目錄下的所有文件以及文件夾

php 删除当前目录下的所有文件以及文件夹

以下是一個安全的 PHP 腳本,用於掃描並刪除當前工作目錄下的所有文件和文件夾(不包括腳本自身,除非特別說明)。腳本包含交互確認,避免誤操作。

<?php
/**
 * 遞歸刪除目錄下的所有內容(不包括當前目錄本身)
 * 
 * @param string      $dir         要清理的目錄路徑
 * @param string|null $excludePath 需要排除的文件/目錄的絕對路徑(例如當前腳本自身)
 * @return bool 是否成功完成(部分失敗也會繼續,返回 false 表示有錯誤)
 */
function deleteAll(string $dir, ?string $excludePath = null): bool
{
    if (!is_dir($dir)) {
        fwrite(STDERR, "錯誤:{$dir} 不是一個目錄\n");
        return false;
    }

    $success = true;
    $dh = @opendir($dir);
    if ($dh === false) {
        fwrite(STDERR, "錯誤:無法打開目錄 {$dir}\n");
        return false;
    }

    while (($item = readdir($dh)) !== false) {
        if ($item === '.' || $item === '..') {
            continue;
        }

        $path = $dir . DIRECTORY_SEPARATOR . $item;

        // 如果設置了排除路徑且當前路徑與排除路徑相同,則跳過
        // (注意:realpath() 會解析符號鏈接,可能導致排除行爲與預期不符,此處保留原邏輯未改動)
        if ($excludePath !== null && realpath($path) === realpath($excludePath)) {
            echo "跳過排除項: {$path}\n";
            continue;
        }

        // 使用 lstat 一次性獲取文件類型(避免多次 is_link/is_dir 調用)
        $stat = @lstat($path);
        if ($stat !== false) {
            // 確保常量可用(部分環境可能未預定義)
            if (!defined('S_IFMT')) define('S_IFMT', 0170000);
            if (!defined('S_IFDIR')) define('S_IFDIR', 0040000);
            if (!defined('S_IFREG')) define('S_IFREG', 0100000);
            if (!defined('S_IFLNK')) define('S_IFLNK', 0120000);

            $mode = $stat['mode'] & S_IFMT;

            if ($mode === S_IFLNK) {
                // 符號鏈接:只刪除鏈接本身,不追蹤目標
                if (unlink($path)) {
                    echo "已刪除符號鏈接: {$path}\n";
                } else {
                    fwrite(STDERR, "錯誤:無法刪除符號鏈接 {$path}\n");
                    $success = false;
                }
                continue;
            }

            if ($mode === S_IFDIR) {
                // 目錄:遞歸刪除內容,再刪除空目錄
                if (deleteAll($path, $excludePath)) {
                    if (rmdir($path)) {
                        echo "已刪除目錄: {$path}\n";
                    } else {
                        fwrite(STDERR, "錯誤:無法刪除目錄 {$path}(可能權限不足或非空)\n");
                        $success = false;
                    }
                } else {
                    $success = false;
                }
                continue;
            }

            if ($mode === S_IFREG) {
                // 普通文件
                if (unlink($path)) {
                    echo "已刪除文件: {$path}\n";
                } else {
                    fwrite(STDERR, "錯誤:無法刪除文件 {$path}\n");
                    $success = false;
                }
                continue;
            }

            // 其他類型(管道、套接字等),嘗試刪除
            if (unlink($path)) {
                echo "已刪除特殊文件: {$path}\n";
            } else {
                fwrite(STDERR, "錯誤:無法刪除特殊文件 {$path}\n");
                $success = false;
            }
        } else {
            // lstat 失敗(如權限不足),回退到傳統判斷方式,儘可能刪除
            if (is_link($path)) {
                if (unlink($path)) {
                    echo "已刪除符號鏈接: {$path}\n";
                } else {
                    fwrite(STDERR, "錯誤:無法刪除符號鏈接 {$path}\n");
                    $success = false;
                }
            } elseif (is_dir($path)) {
                if (deleteAll($path, $excludePath)) {
                    if (rmdir($path)) {
                        echo "已刪除目錄: {$path}\n";
                    } else {
                        fwrite(STDERR, "錯誤:無法刪除目錄 {$path}(可能權限不足或非空)\n");
                        $success = false;
                    }
                } else {
                    $success = false;
                }
            } else {
                if (unlink($path)) {
                    echo "已刪除文件: {$path}\n";
                } else {
                    fwrite(STDERR, "錯誤:無法刪除文件 {$path}\n");
                    $success = false;
                }
            }
        }
    }

    closedir($dh);
    return $success;
}

// 命令行運行檢查
if (PHP_SAPI !== 'cli') {
    die("此腳本僅允許在命令行(CLI)模式下運行。\n");
}

// 獲取當前工作目錄(腳本執行時所在的目錄)
$currentDir = getcwd();
if ($currentDir === false) {
    fwrite(STDERR, "錯誤:無法獲取當前工作目錄\n");
    exit(1);
}

echo "當前工作目錄: {$currentDir}\n";

// 腳本自身的絕對路徑
$selfPath = realpath(__FILE__);
$excludeSelf = false;

// 判斷腳本自身是否位於當前工作目錄下
if ($selfPath !== false && strpos($selfPath, $currentDir . DIRECTORY_SEPARATOR) === 0) {
    $excludeSelf = true;
    echo "注意:腳本自身位於當前目錄,刪除時將排除該文件: " . basename($selfPath) . "\n";
} else {
    echo "腳本自身不在當前目錄,將刪除當前目錄下的所有內容。\n";
}

// 安全確認提示
echo "\n⚠️  警告:此操作將永久刪除當前目錄下的所有文件和文件夾,且不可恢復!\n";
echo "請輸入 'yes' 確認執行: ";
$handle = fopen("php://stdin", "r");
$confirm = trim(fgets($handle));
fclose($handle);

if ($confirm !== 'yes') {
    echo "操作已取消。\n";
    exit(0);
}

echo "\n開始刪除...\n";
$result = deleteAll($currentDir, $excludeSelf ? $selfPath : null);

if ($result) {
    echo "\n✅ 刪除操作完成。\n";
    if ($excludeSelf && file_exists($selfPath)) {
        echo "注意:腳本自身未被刪除,位於 {$selfPath}\n";
        echo "如需同時刪除腳本自身,請手動執行: unlink('{$selfPath}');\n";
    }
} else {
    echo "\n❌ 刪除過程中出現錯誤(部分文件/目錄可能因權限等原因未被刪除)。\n";
    exit(1);
}

安全特性

  • 僅限 CLI 運行:防止通過 Web 訪問意外觸發。

  • 交互確認:必須輸入 yes 纔會執行刪除。

  • 自動排除自身:如果腳本位於當前工作目錄,刪除時會自動跳過,避免運行中異常。

  • 符號鏈接安全:僅刪除鏈接本身,不追蹤鏈接目標,防止誤刪重要數據。

  • 詳細日誌:每個刪除的文件/目錄都會輸出,錯誤信息會顯示到標準錯誤。

  • 權限處理:遇到無權限刪除的文件會報錯並繼續,不會中斷整個流程。

微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

PHP ob函数记录

PHP ob函數記錄 語言筆記 PHP

下面3個函數的用法 ob_get_contents(); ob_end_clean(); ob_start(); 可以藉助這幾個函數實現緩衝本地文件,以及執行本地腳本代碼。 使用ob_start()把輸出的代碼存到緩衝區,頁面不會顯示出來; 然後用ob_get_contents得到緩衝區的數據。 o…
👁 141
PHP preg

PHP preg 語言筆記 PHP

preg_match_all 函數用於執行一個全局正則表達式匹配。preg_match_all() 語法int preg_match_all ( string $pattern , string $subject [, array &amp;$matches [, int $flags = PREG…
👁 169
PHP 三元运算符与if的详解

PHP 三元運算符與if的詳解 語言筆記 PHP

三元運算符語條件 ? 結果1 : 結果2 說明:問號前面的位置是判斷的條件,如果滿足條件時結果1,不滿足時結果2。本文對三元運算符和if...else...進行對比詳解,希望對大家有所幫助。今天在改論文在線的時候遇到了一個語句看不懂:$if_summary = $row['IF_SUMMARY']=…
👁 190
PHP强制转换类型

PHP強制轉換類型 語言筆記 PHP PHP採集 PHP與mysql

獲取數據類型1.如果想查看某個表達式的值和類型,用var_dump()。 2.如果只是想得到一個易讀懂的類型的表達方式用於調試,用 gettype()。3.要查看某個類型,不要用 gettype(),而用is_type() 函數。字符串轉換爲數值當一個字符串被當作數字來求值時,根據以下規則來決定結果…
👁 232
php 字符串中是否包含指定字符串的多种方法

php 字符串中是否包含指定字符串的多種方法 語言筆記 PHP

strstrstrstr() 函數搜索一個字符串在另一個字符串中的第一次出現。該函數返回字符串的其餘部分(從匹配點)。如果未找到所搜索的字符串,則返回 false。代碼如下:&lt;?php $email = 'user@example.com'; $domain = strstr($email, …
👁 138

推薦閱讀

(PC+WAP)五金机械设备营销型网站模板 1019

(PC+WAP)五金機械設備營銷型網站模板 1019 實用收藏 pbootcms模板

一款五金機械設備營銷型PbootCMS網站模板,支持PC與WAP端。設計風格專業營銷,適合五金機械設備企業展示產品與技術實力。有助於機械製造企業在線上展示產品,獲取精準客戶詢盤。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關…
👁 45
响应式人工智能AI芯片网站模板 1018

響應式人工智能AI芯片網站模板 1018 實用收藏 易優模板

一款針對人工智能與AI芯片行業的eyoucms響應式網站模板。設計風格未來科技,能夠展示AI芯片產品、技術研發及應用場景。有助於芯片設計企業在線上樹立品牌形象,吸引投資與客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易…
👁 65
(自适应手机版)html5响应式二极管LED灯具类pbootcms模板 LED灯具网站源码下载 0459

(自適應手機版)html5響應式二極管LED燈具類pbootcms模板 LED燈具網站源碼下載 0459 實用收藏 pbootcms模板

一款自適應手機端的品牌策劃與高端設計類PbootCMS網站模板。設計風格藝術精緻,能夠展示品牌全案、創意設計及商業案例。有助於高端設計公司在線上樹立品牌形象,吸引優質客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關文章P…
👁 40
响应式度假酒店商务客房网站模板 0423

響應式度假酒店商務客房網站模板 0423 實用收藏 易優模板

一款針對度假酒店與商務客房的eyoucms響應式網站模板。設計風格舒適高端,能夠展示酒店環境、客房設施、商務服務及在線預訂。有助於度假酒店在線上吸引遊客與商務客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CMS(E…
👁 38
(自适应手机版)响应式五金外贸英文网站模板 1020

(自適應手機版)響應式五金外貿英文網站模板 1020 實用收藏 pbootcms模板

一款響應式五金外貿英文PbootCMS網站模板,支持PC與WAP端。設計風格國際化專業,適合五金製品外貿企業展示產品與出口優勢。有助於中國五金企業在全球市場上展示品牌形象。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關文章P…
👁 54
响应式电子元器件企业厂家网站模板 1019

響應式電子元器件企業廠家網站模板 1019 實用收藏 易優模板

此套eyoucms響應式模板適用於電子元器件企業廠家,設計風格科技精密,能夠展示電子元件產品、技術參數及行業應用。有助於電子元器件製造商在線上展示產品,吸引電子行業客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CM…
👁 42