2

phpを使用して、削除された投稿の画像を含むフォルダーを削除しています。私はオンラインで見つけた以下のコードを使用していて、良い仕事をしています。

フォルダ内に他のフォルダがある場合に、そのフォルダ内の特定のフォルダのみを削除するにはどうすればよいか知りたいです。

以下のコードを使用する場合、これをどのように行うことができますか?使用:/ dev / images / norman / 8->フォルダ8を削除しません使用:/ dev / images /norman/->すべてのフォルダを削除します

Eg:
/dev/images/norman/8 -> I need to delete only this folder
/dev/images/norman/9
/dev/images/norman/10
/dev/images/norman/11
/dev/images/norman/12

<?php
$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/8';

emptyDir($path);

function emptyDir($path) { 

    // INITIALIZE THE DEBUG STRING
    $debugStr  = '';
    $debugStr .= "Deleting Contents Of: $path<br /><br />";

    // PARSE THE FOLDER
    if ($handle = opendir($path)) {

        while (false !== ($file = readdir($handle))) {

            if ($file != "." && $file != "..") {

                // IF IT"S A FILE THEN DELETE IT
                if(is_file($path."/".$file)) {

                    if(unlink($path."/".$file)) {
                    $debugStr .= "Deleted File: ".$file."<br />";   
                    }

                } else {

                    // IT IS A DIRECTORY
                    // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS

                    if($handle2 = opendir($path."/".$file)) {

                        while (false !== ($file2 = readdir($handle2))) {

                            if ($file2 != "." && $file2 != "..") {
                                if(unlink($path."/".$file."/".$file2)) {
                                $debugStr .= "Deleted File: $file/$file2<br />";    
                                }
                            }

                        }

                    }

                    if(rmdir($path."/".$file)) {
                    $debugStr .= "Directory: ".$file."<br />";  
                    }

                }

            }

        }

    }
    echo $debugStr;
}

?>
4

5 に答える 5

5
<?php

delete_directory($dirname) {
   if (is_dir($dirname))
      $dir_handle = opendir($dirname);
   if (!$dir_handle)
      return false;
   while($file = readdir($dir_handle)) {
      if ($file != "." && $file != "..") {
         if (!is_dir($dirname."/".$file))
            unlink($dirname."/".$file);
         else
            delete_directory($dirname.'/'.$file);    
      }
   }
   closedir($dir_handle);
   rmdir($dirname);
   return true;
 }
?>

バージョン5.1以降を使用している場合は、

<?php
function deleteDir($dir) {
   $iterator = new RecursiveDirectoryIterator($dir);
   foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) 
   {
      if ($file->isDir()) {
         rmdir($file->getPathname());
      } else {
         unlink($file->getPathname());
      }
   }
   rmdir($dir);
}

deleteDir("temporary");
?>
于 2012-09-27T12:57:29.790 に答える
2

あなたはについて聞きたいですrmdir

if(is_file($path."/".$file)) {

    if(unlink($path."/".$file)) {
    $debugStr .= "Deleted File: ".$file."<br />";   
    }

} else {

    if(rmdir($path."/".$file)) {
        $debugStr .= "Deleted Directory: ".$file."<br />";   
    }

}

編集:rmdir空のdirのみを処理できるため、rmdirのページコメントで報告されているように、このソリューションを使用できます。

function rrmdir($dir) {
    foreach(glob($dir . '/*') as $file) {
        if(is_dir($file))
            rrmdir($file);
        else
            unlink($file);
    }
    rmdir($dir);
}

内のすべてを再帰的に削除してから$dir、ディレクトリ自体を削除します。

于 2012-09-27T12:51:14.943 に答える
0

たとえば、システムコマンドを使用できます。exec("rm -rf {$dirPath}");または、PHPでそれを実行したい場合は、再帰的に実行する必要があります。ループはそれを正しく実行しません。

public function deleteDir($path) {

    if ($handle = opendir($path)) {

        while (false !== ($file = readdir($handle))) {

            if ($file != "." && $file != "..") {

                // IF IT"S A FILE THEN DELETE IT
                if(is_file($path."/".$file)) {

                    if(unlink($path."/".$file)) {
                        $debugStr .= "Deleted File: ".$file."<br />";
                    }

                } else {
                    deleteDir($path."/".$file."/");
                    rmdir($path."/".$file);
                }
            }
        }
    }
}

以下のコードを使用する場合、これをどのように行うことができますか?使用:/ dev / images / norman / 8->フォルダ8を削除しません使用:/ dev / images /norman/->すべてのフォルダを削除します

あなたの問題は、「/ dev / images / norman/8」の最後に「/」がないことだと思います

于 2012-09-27T12:55:52.070 に答える
0

関数にパラメータを追加しました$exclude。このパラメータは、削除から除外するディレクトリの名前を含む配列です。次のようになります。

$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/';

emptyDir($path); //will delete all under /norman/
emptyDir($path, array('8')); //will delete all under /norman/ except dir 8
emptyDir($path, array('8','10')); //will delete all under /norman/ except dir 8 and 10

function emptyDir($path,$exclude=false) { 

    // INITIALIZE THE DEBUG STRING
    $debugStr  = '';
    $debugStr .= "Deleting Contents Of: $path<br /><br />";
    if (!$exclude) {
       $exclude = array();
    }

    // PARSE THE FOLDER
    if ($handle = opendir($path)) {

        while (false !== ($file = readdir($handle))) {

            if ($file != "." && $file != "..") {

                // IF IT"S A FILE THEN DELETE IT
                if(is_file($path."/".$file)) {

                    if(unlink($path."/".$file)) {
                    $debugStr .= "Deleted File: ".$file."<br />";   
                    }

                } else if (!in_array($file, $exclude)) {

                    // IT IS A DIRECTORY
                    // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS

                    if($handle2 = opendir($path."/".$file)) {

                        while (false !== ($file2 = readdir($handle2))) {

                            if ($file2 != "." && $file2 != "..") {
                                if(unlink($path."/".$file."/".$file2)) {
                                $debugStr .= "Deleted File: $file/$file2<br />";    
                                }
                            }

                        }

                    }

                    if(rmdir($path."/".$file)) {
                    $debugStr .= "Directory: ".$file."<br />";  
                    }

                }

            }

        }

    }
    echo $debugStr;
}
于 2012-09-27T13:01:00.303 に答える
0
$path='./ggg';
rrmdir($path);
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);
}
}
于 2012-09-27T13:35:33.797 に答える