PHP: как обработать файлы по алфавиту, используя DirectoryIterator?

0

Используя этот путь, после завершения цикла DirectoryIterator
вы получите список имен файлов, и позже вы сможете отсортировать его в алфавитном порядке,
так что вы можете обрабатывать каждый файл с именем файла из этого списка - в алфавитном порядке...

Теперь, что, если после завершения цикла DirectoryIterator,
вам нужен массив (в алфавитном порядке отсортированный по имени файла), который содержит не только имя файла,
но также и все другие свойства файла, такие как:

  • разрешений
  • владелец
  • время создания
  • размер
  • и т.д...

Проблема здесь в том, что вы не можете сортировать до завершения цикла DirectoryIterator,
и после этого вы не сможете получить доступ к чему-либо, кроме имени файла из вашего списка...

Теги:
directory
file
alphabetical

1 ответ

0
Лучший ответ

Объекты DirectoryIterator предоставляют простой способ доступа ко многим свойствам файла.

$dir = new DirectoryIterator($path);
foreach ($dir as $fileInfo) {
    if ((!$fileInfo->isDot())&&($fileInfo->GetExtension() == "txt")) {
        /* You can access the file information inside this cycle */
        $octal_perms = substr(sprintf('%o', $fileInfo->getPerms()), -4);
        echo $fileInfo->getFilename() . " " . $octal_perms . "\n";
    }
}

Если нам нужны объекты fileInfo после завершения цикла DirectoryIterator,
нам придется клонировать (копировать) все эти объекты DirectoryIterator в новый массив,
а затем отсортировать этот массив по алфавиту по атрибуту filename объектов DirectoryIterator.

function cmp($a, $b)
{
    return strcmp($a->getFilename(), $b->getFilename());
}

$dir = new DirectoryIterator($path);
foreach ($dir as $fileInfo) {
    if ((!$fileInfo->isDot())&&($fileInfo->GetExtension() == "txt")) {
        /* we need to clone a fileInfo object into array, not just assign it */
        $allFilesInfo[] = clone $fileInfo;
    }
}

/* Alphabetically sorting the array with DirectoryIterator objects, by filename */
usort($allFilesInfo, 'cmp');

foreach ($allFilesInfo as $fileInfo) {
    /* Everything is alphabetical here ;) */
    $octal_perms = substr(sprintf('%o', $fileInfo->getPerms()), -4);
    echo $fileInfo->getFilename() . " " . $octal_perms . "\n";
}

^^ В этом последнем цикле вы можете работать с вашими файлами в алфавитном порядке,
имея возможность получить доступ ко всем своим свойствам :)

ПРИМЕЧАНИЕ: в случае сбоя, вызванного ошибкой "слишком много открытых файлов",
увеличьте максимальный предел открытых файловых дескрипторов за процесс в вашей ОС.
Связанные файлы конфигурации зависят от вашей ОС, и обычно они хранятся в /etc

  • 0
    «Слишком много открытых файлов» не следует игнорировать. Вы забываете освободить / закрыть ресурсы, если вы получили такую ошибку. НЕ СЛЕДУЕТ просто повышать лимит, не понимая причину такой ошибки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню