[PHP]ディレクトリを再帰的に削除する

Read More




rmdir()を使ってディレクトリを削除しようとしたとき、
削除しようとしたディレクトリ内にファイルや他のディレクトリがあるとディレクトリを削除できない。

中身を全部消したあとにディレクトリを削除するという手順を踏む必要がある。


■ディレクトリを再帰的に削除する
/**
 * ディレクトリを削除する(再帰的)
 *
 * ディレクトリ内にファイルや他のディレクトリが含まれていた場合それも削除する
 */
function rmdir_r($dir_path=null)
{
  if(!strlen($dir_path)) return false;
  if(!file_exists($dir_path)) return true;
  if(is_file($dir_path) or is_link($dir_path)) return @unlink($dir_path);

  $dir = @scandir($dir_path);
  if(!is_array($dir)) return false;

  $dir = array_diff($dir, array('.', '..'));
  foreach($dir as $item)
  {
    if(!rmdir_r($dir_path. '/'. $item)) return false;
  }

  return @rmdir($dir_path);
}


パスの指定をミスったら色々と死ぬのでそこだけは注意が必要。
そういうのを防ぐためになるべく絶対パスで指定したい。

もし相対パスで指定するような場合は必ずカレントディレクトリを示してから指定するようにしたい。
ex) './test'




--
以前、mkdir()を調べた時に第3引数で再帰的に作成することが可能と知ったことがあったので、今回ももしかしてそういうのあるかなーと思って改めてみたけどなかった。




■関連記事
[PHP]ディレクトリを再帰的に削除する_SPL版
http://xirasaya.com/?m=detail&hid=540

[PHP]再帰的なフォルダ生成が行える関数、mkdir()
http://xirasaya.com/?m=detail&hid=445





-- 2017/03/09 コードの一部を修正