dポイントプレゼントキャンペーン実施中!

深い階層のフォルダの作成や削除をPHPで行う方法はありますか?
できれば、WindowsやLinux共通で動作すれば助かります。

A 回答 (2件)

フォルダ作成と削除ということですね。


おそらく問題にされているのは、下記のような点でしょうか。

深い階層のフォルダ作成
 →親フォルダから順に作らないと、サブフォルダを作成することができない
深い階層のフォルダ作成
 →サブフォルダを空にしてから出ないと、親フォルダを削除できない

Windows/Linux共通となると、区切り文字「\」「/」の問題がありますが、
これは定数DIRECTORY_SEPARATORを使うことで解決できます。
この定数は、それぞれの環境で適切な区切り文字が入ってきます。
http://au3.php.net/manual/ja/ref.dir.php

■深い階層のフォルダ作成
・与えられたパスを区切り文字で分割
・上位のフォルダから順に作っていく
ということで、下記のような感じでどうでしょうか。
(スペースが全角です。コピーするときは注意して下さい)

function makedir($dirpath){
  $dirs = explode(DIRECTORY_SEPARATOR , $dirpath);
  $path = '';
  
  foreach ($dirs as $dir) {
    $path .= $dir . DIRECTORY_SEPARATOR;
    
    if (! file_exists($path)) {
      mkdir($path);
    }
  }
}

■深い階層のフォルダを削除
・下位のファイル、フォルダから削除
ということで、dir()、is_dir()、unlink()、rmdir()関数あたりを使って
http://au2.php.net/manual/ja/class.dir.php
http://au2.php.net/is_dir
http://au2.php.net/unlink
http://au2.php.net/rmdir

下記のように書くことができますが、当方のWindows+Apache+PHP4環境では
フォルダ削除時にPermission deniedエラーが出ました。
ベタでrmdir('a:\\b\\c\\d'); rmdir('a:\\b\\c'); …とやっていくと削除
できたりしているのですが、すみませんが原因がわかりませんでした。

function remove($path){
  $d = dir($path);
  
  while ($entry = $d->read()) {
    if ($entry == '.' || $entry == '..') continue;
    
    $objpath = $path . DIRECTORY_SEPARATOR . $entry;
    
    if (is_dir($objpath)) {
      // サブディレクトリを削除
      remove($objpath);
    } else {
      // 見つかったファイルは削除
      unlink($objpath);
    }
  }
  
  unset($d); $d = null;
  rmdir($path);
}

シェル/コマンドラインを使うと簡単だとかいう、元も子もないコメントが
rmdir()のマニュアルページにあったので、それを参考に、
http://au3.php.net/manual/ja/function.rmdir.php# …

$path = '…削除したいフォルダのフルパス…';
// Linux
if (DIRECTORY_SEPARATOR == '/') {
  system('rm -rf ' . $path);
}
// Windows
if (DIRECTORY_SEPARATOR == '\\') {
  system('rmdir ' . $path . ' /s /q');
}

とやってみましたが、いかがでしょうか。

※テスト時は重要なフォルダを消さないようにご注意ください
    • good
    • 0

深い階層・・・って意図がよくわからないですが


普通にmkdirでは作れないという意味でしょうか?

http://www.php.net/manual/ja/function.mkdir.php
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!