次のアイテムに移動する RecursiveIteratorIterator に問題があります。複数のファイルを含むディレクトリがあり、各ファイルに移動して名前を変更し、その他の操作を実行しようとしています。RecursiveIteratorIterator は、ディレクトリから最初のファイルを選択し、その名前を正常に変更します。$it->next() を実行すると、同じファイルにとどまり、既に別の名前に変更されているファイルを検索しようとします。以下は私のコードサンプルです。ファイルのパーミッションは 777 に設定されています。
これは、ファイルの名前を変更した場合にのみ発生します。名前の変更機能を削除すると、期待どおりに次の項目に移動します。
//initialize iterator object
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, 0));
/* loop directly over the object */
while ($it->valid()) {
// check if value is a directory
if (!$it->isDot()) {
if (!is_writable($directory . '/' . $it->getSubPathName())) {
//direcotry not writable, throw error
} else {
// get current file info
$fileinfo = pathinfo($it->getSubPathName());
//get file extension
$ext = $fileinfo['extension'];
//if its a '.', move to next item
if (in_array($fileinfo['filename'], array(".", ".."))) {
$it->next();
}
// the current file name with complete path
$old_file = $directory . '/' . $it->getSubPathName();
throw new Exception('source file doesnot exist ' . $old_file, error::DOESNOTEXIST);
}
//generate new file name with path
$new_file = $directory . '/' . $it->getSubPath() . '/' . $filename . '.' . $ext;
//rename the file
rename($old_file, $new_file);
}
}
/* * * move to the next iteration ** */
$it->next();
}