Slash-Zn
@Slash-Zn

Как установить лимит на количество сканируемых файлов?

Здравствуйте.
Метод для сканирования файлов:
public function scannerContent($dir)
	{
        $list = [];
        if (is_dir($dir))
        {
            if ($handle = opendir($dir))
            {
                chdir($dir);
                while (false !== ($file = readdir($handle)))
                {
                    if ($file != '.' && $file != '..' && $file != 'index.html')
                    {
                        if (is_dir($file))
                        {
                            $subdir = $this->scannerContent($file);
                            foreach ($subdir as $part)
                            {
                                $list[] = $dir . '/' . $part;
                            }
                        }
                        else
                        {
                            $list[] = $dir . '/' . $file;
                        }
                    }
                }

                chdir('../');
            }

            closedir($handle);
        }

        return $list;
	}

Подскажите, как можно установить лимит на количество сканирования файлов, например, 100 файлов за один раз, а не все сразу, что находятся в указанной директории? Необходимо сделать "поэтапную" выборку, сначала первые 100 файлов, вторым этапом вторые 100 файлов, и так далее. Как такое провернуть?

И еще вопросик: Как можно игнорировать сканирование файлов с подстрокой в названии (Три варианта): "_240", "_500", "_1024"?

Заранее спасибо.
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Если речь о том, чтобы проверять по базе не по одному файлу, а собирать пачками по сто (лучше по тысяче), то задача имеет смысл.
Прерывать тупо по счетчику: накопилась тыща - провалились в if, внутри которого всю пачку по базе пробили одним запросом, лишние удалили, массив обнулили, дальше пошли.

Ну или по каталогам бить. В каждом каталоге сначала читать только каталоги и проваливаться в них, а потом считать все файлы, обработать их, и вынырнуть на уровень выше.
Ответ написан
Комментировать
@alexalexes
Если в общих чертах рассказать, то вам нужно сделать такие шаги:
1. Переписать функцию из рекурсивной формы в стековую форму. То есть, вместо того, чтобы пользоваться стеком вызова функций и помещать туда входные параметры вызова (в данном случае, $dir), вам нужно самим на основе массива создать стек для хранения параметров, чтобы реализовать хранение контекста текущей директории.
После того, как вы организуете стек, вы легко можете прерывать функцию в любом месте и сохранять состояние стека в свойстве класса.
2. Сохраняйте дескриптор $handle в свойстве класса и очищайте его, когда полностью пройдете по текущей директории или когда полностью закончите сканирование. Это также позволит прерывать функцию в любом месте.
3. Чтобы сканировать по 100 файлов, делайте локальный счетчик внутри функции и просто выходите из функции, когда достигли макс. значения.
4. Имея 1, 2 и 3, при очередном вызове функции сначала проверяете можно ли воспользоваться дескриптором $handle для чтения очередного файла, если нет, то попытаться вытащить следующий элемент из стека директорий, освежив дескриптор $handle.
Если у вас удалось получить рабочий $handle, то сканирование продолжится.
Когда сканирование находит очередной каталог, то его нужно положить в стек. Если переключаться на сканирование найденного каталога сразу, то у вас будет работать метод сканирования в глубину, если переключаться на новый каталог после того, как закончите сканирование текущего, то сканирование будет работать в ширину.
ЗЫ: чтобы запустить функцию сначала, нужно положить в стек элемент с корневым каталогом.
ЗЫЫ: В стеке удобнее будет хранить дескрипторы а не строковые пути, по ним удобно работать функцией readdir, если у вас будет поиск в глубину.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы