0

我目前正在使用以下代码列出特定目录中的所有子目录。

$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 />";
    }
}
4

2 回答 2

1

您的示例使用该RecursiveIteratorIterator::SELF_FIRST标志,该标志列出了迭代中的叶子和父母,父母首先出现来自文档)。

这意味着具有如下目录结构:

foo/
foo/bar/
foo/bar/bat.txt

迭代顺序是从父节点到叶节点:

  1. 富/
  2. 富/酒吧/
  3. foo/bat/bat.txt

正如您已经注意到的,这可能是有问题的。


根据您的需要,RecursiveIteratorIterator::CHILD_FIRST应该使用该标志。该标志指示迭代器朝另一个方向前进,从叶子到父母。

  1. foo/bar/bat.txt
  2. 富/酒吧/
  3. 富/
于 2018-04-25T19:25:07.400 回答
0

您可以将所有目录存储在一个数组中,然后您可以按降序循环数组,将最后一个文件夹更改为大写。

这是一个例子:

$path = 'custom_design_copy' . DIRECTORY_SEPARATOR;

$main_dir = realpath($path);

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($main_dir), RecursiveIteratorIterator::SELF_FIRST);

foreach ($objects as $name => $object) {

    if ($object->isDir() && !in_array($object->getFilename(), array('.', '..'))) {

        $directories[] = $name;

    }
}

foreach (array_reverse($directories) as $dir) {
    rename($dir, last_path_upper($dir));
}

function last_path_upper($str) {

    $arr = explode(DIRECTORY_SEPARATOR, $str);

    $last = array_pop($arr);

    return join(DIRECTORY_SEPARATOR, $arr) . DIRECTORY_SEPARATOR . strtoupper($last);

}
于 2018-04-25T18:56:03.967 回答