2009-08-26 15 views
27

PHPを使用してコンテンツを含むフォルダを削除する必要があります。 rmdir()unlink()は空のフォルダを削除しますが、内容のあるフォルダは削除できません。PHPを使用してコンテンツを含むフォルダを削除する方法

+6

@@ Maerlyn::私は8月26日、2009年にあなたが言及した重複したものを、この質問を投稿したことが、この(!$rootは常に重要なファイルを削除防ぐために、あなたのTMP directoryに設定する必要があります)のようなものを行くだろう2010年7月28日に投稿されました。あなたは今何をすべきかを知っていると信じています。 – Fero

答えて

80

この関数は(限り、それが書き込み可能だとして)あなたが任意のフォルダを削除することができますし、それがファイルとサブディレクトリです。 RecursiveDirectoryIteratorを使用して

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = array_diff(scandir($path), array('.', '..')); 

     foreach ($files as $file) 
     { 
      Delete(realpath($path) . '/' . $file); 
     } 

     return rmdir($path); 
    } 

    else if (is_file($path) === true) 
    { 
     return unlink($path); 
    } 

    return false; 
} 

または再帰なし:

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); 

     foreach ($files as $file) 
     { 
      if (in_array($file->getBasename(), array('.', '..')) !== true) 
      { 
       if ($file->isDir() === true) 
       { 
        rmdir($file->getPathName()); 
       } 

       else if (($file->isFile() === true) || ($file->isLink() === true)) 
       { 
        unlink($file->getPathname()); 
       } 
      } 
     } 

     return rmdir($path); 
    } 

    else if ((is_file($path) === true) || (is_link($path) === true)) 
    { 
     return unlink($path); 
    } 

    return false; 
} 
+2

。私は非常に単純なコマンドを使用していました: <?php system( "rm -r RESOURCE_PATH"); ?>しかし、残念ながら、一部のサーバではシステムコマンドが許可されていないので、あなたのもの(私は最初のものを選んでしまった)は非常に良い単純な代替手段です。ありがとう、兄弟。 –

+1

これは相対パスでも機能しますか?ですから、完全なパスが "/ var/www/html/folder_and_files_to_delete /"であるとします。そして、削除スクリプトは "/var/www/html/delete_folders_and_files.php"に置かれます。 「folder_and_files_to_delete」をパスとして取得できますか? – yoano

+0

ようこそ、最高の答え – mghhgm

3

フォルダの内容(サブフォルダの内容を含む)をループして最初に削除する必要があります。

例がここにあります:http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

はそれに注意してください!

+3

答えを下げるには、理由を述べてください。 – Fenton

+3

おそらく誰かがトップへの答えを出そうとしています。 +1をオフセットする。 – ryeguy

+0

ryeguyさん、ありがとうございます! – Fenton

0

あなたはいつもあなたが再帰的にすべてのファイルを削除する必要がありますカンニングと shell_exec("rm -rf /path/to/folder");

+2

Windows以外の場合: –

+0

プロダクションではお勧めできません。 – Volomike

+2

@Volomike:なぜですか?これは、PHPソリューションよりも確かに高速です。 – ryeguy

1

を行うことができます。たくさんの例の機能がrmdirマニュアルページのコメントにあります。

http://www.php.net/rmdir

+0

私はrmdirが内容を持たないフォルダだけを削除することを願っています。内容があればフォルダを削除しません。 – Fero

+0

Ford-rmdirは内容があるディレクトリを削除しません。そのため、ディレクトリを削除する場合は、まず内容を削除する必要があります(サブディレクトリの内容を含む) – Fenton

1

単一の機能は、これは、あなたがrmdirを使用して独自に作成し、リンク解除する必要ができるようになるPHPに組み込むませんがあります。

php.net docsにコメントから取られた)例:

<? 
// ensure $dir ends with a slash 
function delTree($dir) { 
    $files = glob($dir . '*', GLOB_MARK); 
    foreach($files as $file){ 
     if(substr($file, -1) == '/') 
      delTree($file); 
     else 
      unlink($file); 
    } 
    rmdir($dir); 
} 
?> 
+1

GLOB_MARKとは何ですか? – Randell

+0

@Randell:GLOB_MARK - 返された各ディレクトリにスラッシュを追加します。 –

3

ここにあなたが必要なものだけを行いますスクリプトです:

/** 
* Recursively delete a directory 
* 
* @param string $dir Directory name 
* @param boolean $deleteRootToo Delete specified top-level directory as well 
*/ 
function unlinkRecursive($dir, $deleteRootToo) 
{ 
    if(!$dh = @opendir($dir)) 
    { 
     return; 
    } 
    while (false !== ($obj = readdir($dh))) 
    { 
     if($obj == '.' || $obj == '..') 
     { 
      continue; 
     } 

     if ([email protected]($dir . '/' . $obj)) 
     { 
      unlinkRecursive($dir.'/'.$obj, true); 
     } 
    } 

    closedir($dh); 

    if ($deleteRootToo) 
    { 
     @rmdir($dir); 
    } 

    return; 
} 

私はphp.netからそれを持って、それが動作。

-3

もっと良い方法はrmです(Linuxの場合)。

function remove($dir) { 

    $root = $_SERVER['DOCUMENT_ROOT'].'/tmp/'; 

    if (is_dir($root.$dir)) { 

     exec('rm -rf '.$root.$dir); 

    } 

} 
+4

削除( "/")...すべて幸せになります:) –

+3

Yikes。シェルコマンドは避けるべきです。 – Volomike

+1

ウェブアプリ内のファイルを削除することは避けてください。相対パスを与えることで、アプリケーションユーザーが許可を持っていればシステム内のファイルを削除できます。 – ArunaFromLK

関連する問題