Как я могу получить полное дерево каталогов с помощью SPL?

Как я могу получить полное дерево каталогов, используя SPL, возможно, используя RecursiveDirectoryIterator и RecursiveIteratorIterator?


person kmunky    schedule 10.03.2010    source источник


Ответы (2)


По умолчанию RecursiveIteratorIterator будет использовать LEAVES_ONLY для второго аргумента __construct. Это означает, что он вернет только файлы. Если вы хотите включить файлы и в каталоги (по крайней мере, это то, что я считаю полным деревом каталогов), вам нужно будет сделать:

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path),
    RecursiveIteratorIterator::SELF_FIRST
);

и тогда вы можете foreach поверх него. Если вы хотите вернуть дерево каталогов вместо его вывода, вы можете сохранить его в массиве, например

foreach ($iterator as $fileObject) {
    $files[] = $fileObject;
    // or if you only want the filenames
    $files[] = $fileObject->getPathname();
}

Вы также можете создать массив $fileObjects без foreach, выполнив:

$files[] = iterator_to_array($iterator);

Если вы хотите, чтобы возвращались только каталоги, foreach вместо $iterator, например:

foreach ($iterator as $fileObject) {
    if ($fileObject->isDir()) {
        $files[] = $fileObject;
    }
}
person Gordon    schedule 16.04.2010

Вы можете просто или делать все, что хотите

foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $file)
{
    /* @var $file SplFileInfo */
    //...
}
person nefo_x    schedule 17.03.2010
comment
Привет, я не понимаю, как - из документа PHP RecursiveIteratorIterator - вы считаете, что $file относится к типу SplFileInfo? - person martin; 29.12.2016