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

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

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

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

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

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 в новый массив,
а затем отсортировать этот массив в алфавитном порядке по атрибуту имени файла объектов 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

Другие решения

Других решений пока нет …