紅穆ノート
レコメンド 言語ノート 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アクセスによる予期せぬトリガーを防止します。

  • インタラクティブ確認:入力が必要です&nbsp; yes この場合のみ、削除処理が実行されます。

  • 自動的に自身を除外するスクリプトが現在の作業ディレクトリ内にある場合、削除処理では自動的にスキップされ、実行中の異常発生を回避します。

  • シンボルリンクのセキュリティリンク自体のみを削除し、リンク先を追跡しないことで、重要なデータを誤って削除するのを防止します。

  • 詳細ログ削除された各ファイルまたはディレクトリが出力され、エラー情報は標準エラー出力に表示されます。

  • 権限処理権限のないファイルに遭遇した場合、エラーが発生しますが、処理は継続され、プロセス全体が中断されることはありません。

微信赞赏

WeChat

支付宝赞赏

Alipay

✍️ クリエイター: 紅穆

ウェブサイト管理者 · ご覧いただきありがとうございます!さらに多くの魅力的なコンテンツをお楽しみいただけますよう、引き続きご支援をお願いいたします。

著者プロフィール プロフィールを見る →

関連記事

PHPのob関数の記録

PHPのob関数の記録 言語ノート PHP

以下の3つの関数(`ob_get_contents()`、`ob_end_clean()`、`ob_start()`)を用いることで、ローカルファイルのバッファリングやローカルスクリプトコードの実行を実現できます。`ob_start()`を用いて出力されるコードをバッファに保存すると、ページは即座に表示されません。その後、`ob_get_contents()`を呼び出してバッファに保存されたデータを取得します。
👁 154
PHP preg

PHP preg 言語ノート PHP

`preg_match_all` 関数は、グローバルな正規表現マッチングを実行するために使用されます。`preg_match_all()` の構文は以下の通りです:`int preg_match_all( string $pattern , string $subject [, array &$matches [, int $flags = PREG… ] )`
👁 174
PHPにおける三項演算子と`if`文の詳細解説

PHPにおける三項演算子と`if`文の詳細解説 言語ノート PHP

三元演算子(? 表示式1 : 表示式2):説明:問号の前に続く部分が条件であり、条件が満たされた場合に表示式1、そうでない場合に表示式2が返されます。本記事では、三元演算子と `if...else...` 文を比較・詳細に解説しており、皆様の参考になれば幸いです。本日、論文のオンライン修正作業中に、以下の文が理解できなかったことに遭遇しました:`$if_summary = $row['IF_SUMMARY'] = ...`
👁 198
PHPにおける型強制変換

PHPにおける型強制変換 言語ノート PHP PHPデータ収集 PHPとMySQL

データ型の確認:1. 指定された式の値および型を確認する場合、`var_dump()` を使用します。2. デバッグ目的で、読みやすい型表現を取得する場合、`gettype()` を使用します。3. 指定された型を確認する場合は、`gettype()` ではなく `is_type()` 関数を使用してください。文字列を数値に変換:文字列が数値として評価される場合、結果は以下のルールに基づいて決定されます…
👁 240
PHPで指定された文字列が文字列に含まれているかどうかを判定するさまざまな方法

PHPで指定された文字列が文字列に含まれているかどうかを判定するさまざまな方法 言語ノート PHP

`str strstr()` 関数は、ある文字列が別の文字列内で最初に出現する位置を検索します。この関数は、一致した位置から始まる文字列の残りの部分を返します。対象の文字列が見つからない場合、`false` を返します。コード例:`< ?php $email = 'user@example.com'; $domain = strstr($email, ...
👁 145

おすすめ読書

タイトルに基づいて記事を自動生成するAIをどのように訓練するか

タイトルに基づいて記事を自動生成するAIをどのように訓練するか 落とし穴のまとめ

記事の自動生成を行うAIの学習は、通常、自然言語処理(NLP)技術と機械学習アルゴリズムを用いて実施される。学習の一般的なプロセスは以下の通りである。まず、タイトルおよび本文を含む多数の記事データを収集する。収集先としては、ウェブサイト、ニュース、ブログなどから行うことができる。収集したデータの量と品質は、学習の精度に大きく影響する。次に、収集したデータをクリーニングおよび前処理する。これにより、…
👁 357
mysql-bin.000001ファイルは削除してもよいですか?

mysql-bin.000001ファイルは削除してもよいですか? 落とし穴のまとめ

通常、MySQLのバイナリログファイル(`mysql-bin.000001` やその他の対応するバイナリログファイル)を手動で削除することを推奨しません。なぜなら、バイナリログはMySQLデータベースがすべての変更操作を記録するために使用するバイナリファイルであるため、これらのファイルを手動で削除すると、以下の問題が生じる可能性があります:ログバックアップ — MySQLのデータ復元が必要な場合、これらのバイナリログを使用する必要がある場合があります…
👁 362
(PC+WAP)展示会関連PBootCMSウェブサイトテンプレート/会展機器・ステージレンタルウェブサイトソースコードダウンロード:0040

(PC+WAP)展示会関連PBootCMSウェブサイトテンプレート/会展機器・ステージレンタルウェブサイトソースコードダウンロード:0040 実用収集 pbootcmsテンプレート

一款针对展会展览及舞台设备租赁行业的PbootCMS网站模板,支持PC端与WAP移动端。设计风格大气现代,能够展现会展活动的专业与规模。模板内置展会排期、设备展示、案例集锦等模块,是会展公司或设备租赁商获客与品牌推广的优质选择。模板展示 安装说明 网站后台:/admin.php 账号:admin 密…
👁 44
(適応型スマートフォン向け)青色のレスポンシブ環境工学機器用PBootCMSウェブサイトテンプレート – HTML5環境保護機器ウェブサイトソースコードダウンロード(0402)

(適応型スマートフォン向け)青色のレスポンシブ環境工学機器用PBootCMSウェブサイトテンプレート – HTML5環境保護機器ウェブサイトソースコードダウンロード(0402) 実用収集 pbootcmsテンプレート

HTML5技術を採用した、スマートフォン向けの適応型ブルー系レスポンシブ環境工学・環境保護関連機器用ウェブサイトテンプレート「PbootCMS」です。専門的で技術的なデザインスタイルを採用しており、環境保護関連の工学プロジェクト、機器製品およびソリューションの紹介に最適です。環境保護工事会社が自社の技術力をオンラインで発信し、顧客獲得に役立ちます。テンプレートの表示・インストール手順:ウェブサイトの管理画面:/admin.php|ユーザー名:admin|パスワード:admin|解凍用パスワード:w…
👁 57
(自适应手机端)蓝色大气化工滤料石材厂家pbootcms模板 磨料生产网站源码下载 0403

(自适应手机端)蓝色大气化工滤料石材厂家pbootcms模板 磨料生产网站源码下载 0403 実用収集 pbootcmsテンプレート

本套自适应手机端的蓝色大气化工滤料与磨料生产PbootCMS网站模板。设计风格专业稳重,适合展示化工滤料、磨料产品及工业应用。有助于化工材料企业在线上展示生产实力,吸引工业客户。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密码:www.4s5.cn相关…
👁 44