PHPコーディング

ディレクトリ以下のファイルとディレクトリを全て削除

2008年08月30日
ディレクトリの削除は【rmdir】関数を使えばできるのですが、ディレクトリが空の場合のみ削除できます。
つまり、ディレクトリの下に、ファイルやディレクトリがあると、エラーになります。


そのため、まず削除したいディレクトリにあるファイルとディレクトリを削除した後で、目的のディレクトリを削除します。

function DirAllDelete($del_dir, $flag="off"){
 $dir = @opendir($del_dir);
 if($dir == true){
  while($file = readdir($dir)){
   if(($file != ".") && ($file != "..")){
    //ファイルならすぐ削除
    if(is_file($del_dir."/".$file) === true){
     $result = unlink($del_dir."/".$file);
     if($result === false){
      return false;
     }
    }
    //ディレクトリなら、まずその下のファイルを削除
    elseif(is_dir($del_dir."/".$file) === true){
     //ファイル数カウント
     $result = $this -> CntFileNum($del_dir."/".$file, $cnt);
     if($result === false){
      return false;
     }
     //ファイルがなければディレクトリ削除
     if($cnt == 0){
      $result = rmdir($del_dir."/".$file);
      if($result === false){
       return false;
      }
     }
     //ファイルがあれば、まずファイルを削除
     else{
      $result = $this -> DirAllDelete($del_dir."/".$file);
      if($result === false){
       return false;
      }
      //その後ディレクトリを削除
      $result = rmdir($del_dir."/".$file);
      if($result === false){
       return false;
      }
     }
    }
   }
  }
 }
 else{
  return false;
 }
 
 //自分自身も削除の場合
 if($flag == 'on'){
  $result = rmdir($del_dir);
  if($result === false){
   return false;
  }
 }
 
 return true;
}

function CntFileNum($dir_cnt, &$cnt){
 $cnt = 0;
 $dir = @opendir($dir_cnt);
 if($dir == true){
  while($file = readdir($dir)){
   if(($file != ".") && ($file != "..")){
    $cnt++;
   }
  }
  return true;
 }
 else{
  return false;
 }
}


コール側は、
$result = DirAllDelete($del_dir, 'on');
です。