В настоящее время я использую следующий код для перечисления всех подкаталогов в определенном каталоге.
$dir = realpath('custom_design_copy/');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
if(is_dir($object)){
echo "$name<br />";
}
}
Это дает мне результаты, которые выглядят примерно так:
C:\Data\Web\custom_design_copy\Product
C:\Data\Web\custom_design_copy\Product\images
C:\Data\Web\custom_design_copy\Product\Scripts
Я хочу переименовать все эти подкаталоги с помощью strtoupper()
, чтобы нормализовать все их имена.Мне известна функция rename()
, но я боюсь, что, если я попробую следующее:
rename($name, strtoupper($name));
, я изменю одно из имен родительских каталогов custom_design_copy, чего я надеюсь избежать.Как я могу избежать этой проблемы?Я думал об использовании substr()
и поиске последнего вхождения «\», чтобы изолировать имя каталога в конце, но для этого должно быть более простое решение.Конечный результат, который я ищу, таков:
C:\Data\Web\custom_design_copy\PRODUCT
C:\Data\Web\custom_design_copy\PRODUCT\IMAGES
C:\Data\Web\custom_design_copy\PRODUCT\SCRIPTS
РЕДАКТИРОВАТЬ: В ожидании совета, я попытался мой первоначальный подход и обнаружил, что он работает.
$dir = realpath('custom_design_copy/');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
if(is_dir($object)){
$slashPos = strrpos($name, '\\');
$newName = substr($name, 0, $slashPos + 1) . strtoupper(substr($name, $slashPos + 1));
rename($name, $newName);
echo "$name<br />";
}
}