フォルダへの再帰的な関数処理方を教えてください
すみませんがPHPのコードについて質問させてください。
PHP : 5.3.5
OS : WindowsXP
コマンドラインにてPHPを作動させ、各ディレクトリ内にある.svnディレクトリを再帰的に全て削除しようと思って以下のコードを書きました。
<?php
error_reporting(E_ALL | E_STRICT);
define('DS', DIRECTORY_SEPARATOR);
define('PS', PATH_SEPARATOR);
require_once('Zend' . DS . 'Debug.php');
function e ($message)
{
echo $message . PHP_EOL;
}
function d ($var, $label = null)
{
Zend_Debug::dump($var, $label);
}
$date = date('Y/m/d H:i:s');
e("====== START(" . $date . ") ======");
$arg1 = realpath($argv[1]);
if (!is_dir($arg1))
{
e($arg1 . "はディレクトリじゃないよ?");
}
else
{
function removeSVN ($dirname)
{
$parentDir = new DirectoryIterator($dirname);
foreach ($parentDir as $key => $childDir)
{
$realChild = realpath($childDir);
if ($childDir->isDir() && !$childDir->isDot())
{
if ($childDir == ".svn")
{
e("Delete : " . $childDir->getFilename());
//ココでrealpath()化するか、chdir()をしないと
//$childDirではエラーになります
rmdir($realChild);
}
else
{
e("Insert : " . realpath($childDir->getFilename()));
//以下の一文を抜けばエラーにはならず、".\CLI\centurion"内
//の.SVNは削除されますが、勿論再帰的には作動しません。
call_user_func('removeSVN', $childDir);
}
}
}
}
//ココでrealpath()化するか、chdir()をしないと$argv[1]ではエラーになります
removeSVN($arg1);
}
e("============ END ============");
で、
C:\php> php.exe .\CLI\removeSVN.php .\CLI\centurion
と実行すると、
====== START(2011/10/02 22:00:34) ======
Insert :
Fatal error: Uncaught exception 'UnexpectedValueException' with message 'DirectoryIterator::__construct(application,application): 指定されたファイルが見つかりません。 (code: 2)' in C:\php\CLI\removeSVN.php on line 32
UnexpectedValueException: DirectoryIterator::__construct(application,application): 指定されたファイルが見つかりません。 (code: 2) in C:\php\CLI\removeSVN.php on line 32
Call Stack:
0.0030 381536 1. {main}() C:\php\CLI\removeSVN.php:0
0.0067 396576 2. removeSVN() C:\php\CLI\removeSVN.php:54
0.0092 397784 3. call_user_func() C:\php\CLI\removeSVN.php:49
0.0093 397800 4. removeSVN() C:\php\CLI\removeSVN.php:49
0.0093 398336 5. DirectoryIterator->__construct() C:\php\CLI\removeSVN.php:32
とエラーが出ます。
エラー内にある32行目とは$parentDir = new DirectoryIterator($dirname);の事です。
自分は、call_user_func()にて$childDirディレクトリ内に入り、また再帰的に.svnフォルダを見つけて削除しようと考えたのですが、ダメでした。
自分の力では分かりませんのでアドバイスをいただけないでしょうか?
ディレクトリの最後まで行き、ファイルのみになった場合に帰れるように、continue文を入れないといけないのかな、とも思ったのですが、良く分かりませんでした。
お礼
ありがとうございます 私のパソコンにはVisual Studioコードはエディターとしてインストールしてありますが visual studioはインストールしていません それでもvisual codeを使ってインストールしたということなんでしょうか?