- ベストアンサー
深い階層のフォルダの作成や削除をPHPで
深い階層のフォルダの作成や削除をPHPで行う方法はありますか? できれば、WindowsやLinux共通で動作すれば助かります。
- みんなの回答 (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#64460 $path = '…削除したいフォルダのフルパス…'; // Linux if (DIRECTORY_SEPARATOR == '/') { system('rm -rf ' . $path); } // Windows if (DIRECTORY_SEPARATOR == '\\') { system('rmdir ' . $path . ' /s /q'); } とやってみましたが、いかがでしょうか。 ※テスト時は重要なフォルダを消さないようにご注意ください
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
深い階層・・・って意図がよくわからないですが 普通にmkdirでは作れないという意味でしょうか? http://www.php.net/manual/ja/function.mkdir.php