283

すべてのファイルを含むディレクトリを削除する最も簡単な方法は何ですか?

フォルダを削除するために使用rmdir(PATH . '/' . $value);していますが、その中にファイルがある場合、それを削除することはできません。

4

34 に答える 34

424

現在、利用可能なオプションは少なくとも 2 つあります。

  1. フォルダーを削除する前に、そのすべてのファイルとフォルダーを削除します (これは再帰を意味します)。次に例を示します。

    public static function deleteDir($dirPath) {
        if (! is_dir($dirPath)) {
            throw new InvalidArgumentException("$dirPath must be a directory");
        }
        if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
            $dirPath .= '/';
        }
        $files = glob($dirPath . '*', GLOB_MARK);
        foreach ($files as $file) {
            if (is_dir($file)) {
                self::deleteDir($file);
            } else {
                unlink($file);
            }
        }
        rmdir($dirPath);
    }
    
  2. また、5.2 以降を使用している場合は、再帰を自分で実装せずに RecursiveIterator を使用して実行できます。

    $dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree';
    $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
    $files = new RecursiveIteratorIterator($it,
                 RecursiveIteratorIterator::CHILD_FIRST);
    foreach($files as $file) {
        if ($file->isDir()){
            rmdir($file->getRealPath());
        } else {
            unlink($file->getRealPath());
        }
    }
    rmdir($dir);
    
于 2010-07-28T03:51:47.877 に答える
98

すべてのファイルを含むディレクトリを削除する最も簡単な方法は何ですか?

system("rm -rf ".escapeshellarg($dir));
于 2010-07-28T04:03:08.287 に答える
55

仕事をする短い関数:

function deleteDir($path) {
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}

私はこれを次のようなUtilsクラスで使用します。

class Utils {
    public static function deleteDir($path) {
        $class_func = array(__CLASS__, __FUNCTION__);
        return is_file($path) ?
                @unlink($path) :
                array_map($class_func, glob($path.'/*')) == @rmdir($path);
    }
}

大きな力には大きな責任が伴います。空の値でこの関数を呼び出すと、root(/)で始まるファイルが削除されます。安全策として、パスが空かどうかを確認できます。

function deleteDir($path) {
    if (empty($path)) { 
        return false;
    }
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
于 2011-12-31T13:12:20.273 に答える
31

PHP マニュアル ページrmdir()( http://php.net/manual/es/function.rmdir.phpを参照) に関する最も投票されたコメントに見られるように、glob()関数は隠しファイルを返しません。 scandir()その問題を解決する代替手段として提供されています。

そこに記載されているアルゴリズム(私の場合は魅力的に機能しました)は次のとおりです。

<?php 
    function delTree($dir)
    { 
        $files = array_diff(scandir($dir), array('.', '..')); 

        foreach ($files as $file) { 
            (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        }

        return rmdir($dir); 
    } 
?>
于 2013-01-25T23:01:45.257 に答える
20

Symfony のファイルシステム( code ) を使用できます:

// composer require symfony/filesystem

use Symfony\Component\Filesystem\Filesystem;

(new Filesystem)->remove($dir);

ただし、この方法では一部の複雑なディレクトリ構造を削除できませんでした。そのため、最初に試して、正しく機能することを確認してください。


Windows 固有の実装を使用して、上記のディレクトリ構造を削除できます。

$dir = strtr($dir, '/', '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');


完全を期すために、ここに私の古いコードを示します。

function xrmdir($dir) {
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }
        $path = $dir.'/'.$item;
        if (is_dir($path)) {
            xrmdir($path);
        } else {
            unlink($path);
        }
    }
    rmdir($dir);
}
于 2015-05-17T21:09:55.837 に答える
19

これは短いバージョンです

function deleteDirectory($dirPath) {
    if (is_dir($dirPath)) {
        $objects = scandir($dirPath);
        foreach ($objects as $object) {
            if ($object != "." && $object !="..") {
                if (filetype($dirPath . DIRECTORY_SEPARATOR . $object) == "dir") {
                    deleteDirectory($dirPath . DIRECTORY_SEPARATOR . $object);
                } else {
                    unlink($dirPath . DIRECTORY_SEPARATOR . $object);
                }
            }
        }
    reset($objects);
    rmdir($dirPath);
    }
}
于 2012-11-21T20:49:16.413 に答える
10

ここでは、そのディレクトリを含むソース ディレクトリ内のすべてのファイルを削除するための 1 つの素晴らしく単純な再帰があります。

function delete_dir($src) { 
    $dir = opendir($src);
    while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' )) { 
            if ( is_dir($src . '/' . $file) ) { 
                delete_dir($src . '/' . $file); 
            } 
            else { 
                unlink($src . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
    rmdir($src);

}

関数は、ディレクトリをコピーするために行われる再帰に基づいています。ここでその機能を見つけることができます: Copy whole contents of a directory to another using php

于 2013-02-23T14:03:47.797 に答える
8

次のように試すことができます。

/*
 * Remove the directory and its content (all files and subdirectories).
 * @param string $dir the directory name
 */
function rmrf($dir) {
    foreach (glob($dir) as $file) {
        if (is_dir($file)) { 
            rmrf("$file/*");
            rmdir($file);
        } else {
            unlink($file);
        }
    }
}
于 2018-11-15T05:54:08.883 に答える
4

私にとってのベストソリューション

my_folder_delete("../path/folder");

コード:

function my_folder_delete($path) {
    if(!empty($path) && is_dir($path) ){
        $dir  = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs are not included,otherwise DISASTER HAPPENS :)
        $files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($files as $f) {if (is_file($f)) {unlink($f);} else {$empty_dirs[] = $f;} } if (!empty($empty_dirs)) {foreach ($empty_dirs as $eachDir) {rmdir($eachDir);}} rmdir($path);
    }
}

ps覚えておいてください!
ディレクトリ削除関数に EMPTY VALUES を渡さないでください!!! (常にバックアップしてください。そうしないと、いつか災害が発生する可能性があります!!)

于 2014-11-26T09:10:03.703 に答える
4

これはどうですか:

function recursiveDelete($dirPath, $deleteParent = true){
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
        $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
    }
    if($deleteParent) rmdir($dirPath);
}
于 2015-10-13T10:34:15.503 に答える
4

glob 関数は隠しファイルを返さないため、ツリーを再帰的に削除しようとする場合は scandir がより便利です。

<?php
public static function delTree($dir) {
   $files = array_diff(scandir($dir), array('.','..'));
    foreach ($files as $file) {
      (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
    }
    return rmdir($dir);
  }
?>
于 2017-01-04T17:54:53.587 に答える
4

シンボリックリンクの処理に関する@Vijitのコメントで@alcuadradoの回答を拡張したいと思います。まず、getRealPath() を使用します。ただし、フォルダーであるシンボリックリンクがある場合、リンクで rmdir を呼び出そうとするため失敗します。そのため、追加のチェックが必要です。

$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
    if ($file->isLink()) {
        unlink($file->getPathname());
    } else if ($file->isDir()){
        rmdir($file->getPathname());
    } else {
        unlink($file->getPathname());
    }
}
rmdir($dir);
于 2017-06-06T14:01:19.640 に答える
3

成功するとTRUEを返し、失敗するとFALSEを返すので、これが好きです。また、空のパスが'/ *'からすべてを削除しようとするバグを防ぎます!!:

function deleteDir($path)
{
    return !empty($path) && is_file($path) ?
        @unlink($path) :
        (array_reduce(glob($path.'/*'), function ($r, $i) { return $r && deleteDir($i); }, TRUE)) && @rmdir($path);
}
于 2012-07-26T01:49:56.653 に答える
3

以前の回答と同等の DirectoryIterator を使用する…</p>

function deleteFolder($rootPath)
{   
    foreach(new DirectoryIterator($rootPath) as $fileToDelete)
    {
        if($fileToDelete->isDot()) continue;
        if ($fileToDelete->isFile())
            unlink($fileToDelete->getPathName());
        if ($fileToDelete->isDir())
            deleteFolder($fileToDelete->getPathName());
    }

    rmdir($rootPath);
}
于 2018-02-16T14:39:34.797 に答える
2

このようなもの?

function delete_folder($folder) {
    $glob = glob($folder);
    foreach ($glob as $g) {
        if (!is_dir($g)) {
            unlink($g);
        } else {
            delete_folder("$g/*");
            rmdir($g);
        }
    }
}
于 2013-01-30T13:13:20.077 に答える
1

フォルダー内のすべてのファイルを
array_map('unlink', glob("$directory/*.*"));
削除する フォルダー内のすべての .*-ファイルを削除する ("." および ".." を除く)
array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
フォルダー自体を削除する
rmdir($directory)

于 2015-07-07T07:34:43.470 に答える
1

完璧に機能するソリューションは次のとおりです。

function unlink_r($from) {
    if (!file_exists($from)) {return false;}
    $dir = opendir($from);
    while (false !== ($file = readdir($dir))) {
        if ($file == '.' OR $file == '..') {continue;}

        if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
            unlink_r($from . DIRECTORY_SEPARATOR . $file);
        }
        else {
            unlink($from . DIRECTORY_SEPARATOR . $file);
        }
    }
    rmdir($from);
    closedir($dir);
    return true;
}
于 2017-12-20T06:48:32.567 に答える
0

シンプルで簡単...

$dir ='pathtodir';
if (is_dir($dir)) {
  foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
    if ($filename->isDir()) continue;
    unlink($filename);
  }
  rmdir($dir);
}
于 2016-05-27T11:34:08.887 に答える
0

Playnox のソリューションに似ていますが、エレガントな組み込みの DirectoryIterator を使用します。

function delete_directory($dirPath){
 if(is_dir($dirPath)){
  $objects=new DirectoryIterator($dirPath);
   foreach ($objects as $object){
    if(!$object->isDot()){
     if($object->isDir()){
      delete_directory($object->getPathname());
     }else{
      unlink($object->getPathname());
     }
    }
   }
   rmdir($dirPath);
  }else{
   throw new Exception(__FUNCTION__.'(dirPath): dirPath is not a directory!');
  }
 }
于 2014-10-21T11:20:28.117 に答える
0
<?php
  function rrmdir($dir) {
  if (is_dir($dir)) {
    $objects = scandir($dir);
    foreach ($objects as $object) {
      if ($object != "." && $object != "..") {
        if (filetype($dir."/".$object) == "dir") 
           rrmdir($dir."/".$object); 
        else unlink   ($dir."/".$object);
      }
    }
    reset($objects);
    rmdir($dir);
  }
 }
?>

php.net の obove コードを試してみてください。

私のためにうまく働いてください

于 2013-04-03T13:06:49.863 に答える
0

Windows の場合:

system("rmdir ".escapeshellarg($path) . " /s /q");
于 2013-11-01T16:59:20.940 に答える
0

この関数をどこからコピーしたかは覚えていませんが、リストされていないようで、機能しているようです

function rm_rf($path) {
    if (@is_dir($path) && is_writable($path)) {
        $dp = opendir($path);
        while ($ent = readdir($dp)) {
            if ($ent == '.' || $ent == '..') {
                continue;
            }
            $file = $path . DIRECTORY_SEPARATOR . $ent;
            if (@is_dir($file)) {
                rm_rf($file);
            } elseif (is_writable($file)) {
                unlink($file);
            } else {
                echo $file . "is not writable and cannot be removed. Please fix the permission or select a new path.\n";
            }
        }
        closedir($dp);
        return rmdir($path);
    } else {
        return @unlink($path);
    }
}
于 2015-08-12T13:39:48.860 に答える
-1

ここに簡単な解決策があります

$dirname = $_POST['d'];
    $folder_handler = dir($dirname);
    while ($file = $folder_handler->read()) {
        if ($file == "." || $file == "..")
            continue;
        unlink($dirname.'/'.$file);

    }
   $folder_handler->close();
   rmdir($dirname);
于 2013-01-06T15:22:39.523 に答える