PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPでディレクトリ内の全ファイルを削除してからディレクトリ自体を削除する方法

globを使ってパターンに一致するファイルを取得する

PHPでは、glob関数を使用することで、指定したパターンに一致するすべてのファイルやディレクトリを簡単に取得できます。この仕組みを利用すると、ディレクトリ内のファイルを再帰的に削除(unlink)し、空になったディレクトリを最後に削除(rmdir)することが可能です。

再帰的にディレクトリを削除する関数

以下は、サブディレクトリも含めてディレクトリの中身を完全に削除する再帰関数の例です。

function recursive_directory_removal($directory) {
    foreach(glob("{$directory}/*") as $file) {
        if(is_dir($file)) {
            recursive_directory_removal($file);
        } else {
            unlink($file);
        }
    }
    rmdir($directory);
}

この関数の動作は次のとおりです。

  • globで対象ディレクトリ内のすべてのエントリを取得します。
  • エントリがディレクトリの場合は、自身を再帰的に呼び出して中身を先に削除します。
  • エントリがファイルの場合は、unlinkで削除します。
  • すべての処理が完了した後、空になったディレクトリをrmdirで削除します。

PHP 5.3以降で使える簡潔な書き方

PHP 5.3以降では無名関数(クロージャ)が利用できるため、array_walkと組み合わせることで、よりシンプルに記述できます。

$dir = 'path/to/directory';

// ディレクトリ内のファイルをすべて削除
array_walk(glob($dir . '/*'), function ($fn) {
    if (is_file($fn)) {
        unlink($fn);
    }
});

// 空になったディレクトリを削除
rmdir($dir);

このコードでは、globで取得した各パスに対して無名関数を実行し、ファイルのみをunlinkで削除しています。その後、rmdirでディレクトリ本体を削除します。なお、ディレクトリを削除する際はunlinkではなくrmdirを使用する点に注意してください。

注意点

  • globはデフォルトでは隠しファイル(ドットで始まるファイル)にマッチしないため、必要に応じてフラグを指定してください。
  • サブディレクトリが存在する場合は、上記の再帰関数か、RecursiveDirectoryIteratorRecursiveIteratorIteratorを組み合わせた方法の利用を検討するとよいでしょう。
  1. Macのストレージを圧迫する6つのアプリとファイル—今すぐ見直したい容量の犯人

    多くのMacユーザーにとって、ストレージ容量は限られた貴重なリソースです。MacBook Proは最大8TBのストレージまで選択できますが、そのアップグレードには約2,600ドルという追加費用が必要になるため、ほとんどの人は256GBから始まるベースモデルのMacBookを選ぶことになります。さらに古いモデルを使っている場合は、その半分の容量しかないこともあるでしょう。Macの空き容量に常に悩まされているなら、以下の6つのアプリやファイルを見直してみてください。意外なほど大量のスペースを占領しているかもしれません。1. Adobe Creative Cloud:本当に使っていますか?クリエイテ

  2. C#で指定したパス内のすべてのファイルとフォルダーを削除する方法

    はじめにC#では、System.IO 名前空間を利用することで、指定したパス配下のすべてのフォルダーとファイルを簡単に削除できます。特に DirectoryInfo クラスを使うと、ディレクトリ内のサブディレクトリやファイルの詳細情報を取得できるため、一括削除処理の実装に便利です。サンプルコードここでは、「Demo」というディレクトリの中に2つのサブディレクトリといくつかのファイルが存在する場合を例に説明します。using System.IO; namespace DemoApplication {    class Program {     &nbs