Заказ в Файловой СистемеИтератор

http://php.net/manual/en/class.filesystemiterator.php

Я заметил, что FilesystemIterator возвращает файлы, упорядоченные по имени. Кто-нибудь может подтвердить, что это правда, и это всегда происходит? Я не нашел ничего в документах.

Другой вопрос, есть ли способ получить файлы, упорядоченные по времени создания на диске? getCTime() кажется, возвращает время изменения, поэтому я не могу использовать его с usort()

1

Решение

Я немного покопался во внутренностях PHP.

Если я не ошибаюсь, метод __construct FileSystemIterator заканчивается использованием VCWD_OPENDIR C макрос: https://github.com/php/php-src/blob/2f443acad19816e29b0c944426238d9f23af1ae2/main/streams/plain_wrapper.c#L908

Это макрос для C функция opendir(),

Просматривая документацию по этой функции, я не вижу ничего, что позволило бы определить порядок любого типа: http://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html

Зная это, я бы предположил, что порядок не является обязательным и может варьироваться в зависимости от типа используемой файловой системы (fat32, ntfs и т. Д.).

Поэтому, если бы вы были на моем месте, я бы реализовал функцию PHP, которая бы упорядочивала их так, как я хочу.

По второму вопросу проверьте: PHP: как я могу получить дату создания файла?

1

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

Вы должны отсортировать их вне FilesystemIterator, поскольку он только повторяется.

Вот пример:

$files = array();
$dir = new DirectoryIterator('.');
foreach ($dir as $fileinfo) {
$files[$fileinfo->getMTime()][] = $fileinfo->getFilename();
}

ksort($files);
1

Я заметил, что FilesystemIterator возвращает файлы, упорядоченные по имени. Кто-нибудь может подтвердить, что это правда, и это всегда происходит? Я не нашел ничего в документах.

Вы не можете сортировать данные, полученные из итератора. Зачем? Поскольку Итератор ленив в обработке данных, это означает, что итератор знает только об 1 элементе за один раз.

Таким образом, итератор не сортирует файлы каким-либо образом, и вы не можете сортировать данные напрямую из итератора, вам нужно сохранить их в массив или около того, чтобы иметь возможность сортировать данные.

Другой вопрос, есть ли способ получить файлы, упорядоченные по времени создания на диске?

usort() это хорошая идея, но не с DirectoryIterator::getCTime(), потому что это метод итератора. Но вы можете использовать: filemtime() (Просто знайте, что функция кэшируется!)

1

На самом деле порядок может быть случайным. Итак, вы должны сортировать произвольно. Для сортировки по алфавиту используйте эту простую конструкцию:

$files = iterator_to_array(new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), true);
ksort($files);

Установите флаги по мере необходимости.

0
По вопросам рекламы [email protected]