Как сделать список файлов на сайте
В PHP пятой версии есть отличная функция scandir, которая возвращает массив файлов и директорий в определенной директории. В качестве параметра принимает имя директории.
Список файлов и директорий
scandir принимает 2 параметра: string directory — имя директории (обязательный), integer sorting_order — необязательный параметр сортировки (два возможных значения: 0 — в алфавитном порядке по возрастанию; 1 — по убыванию).
. [1] => .. [2] => bar.php [3] => foo.txt [4] => somedir ) Array ( [0] => somedir [1] => foo.txt [2] => bar.php [3] => .. [4] => . ) */ ?>
Улучшаем scandir
Напишем свою функцию myscandir , которая идентична scandir за исключением того, что удаляются . и .. , которые, как мне кажется, редко используются.
myscandir
Примечание
Для работы этой функции нужна 5ятая версия PHP.
Категории
Комментарии
мне казалось легче использовать array_pop(): или array_shift(); - в зависимости от расположения точек
Листинг директорий - это получение информации о каталогах и файлах для заданной родительской директории, а также возможность применить к этим данным различные фильтры для коррекции вывода.
Базовые решения
Первый набор примеров использует функции glob() и комбинации функций opendir(), readdir(), closedir(), а также функцию scandir().
Использование glob()
- $pattern (обязательный): строка шаблона поиска
- $flags (не обязательный): один или несколько флагов
- GLOB_MARK - Добавляет слеш к каждой возвращаемой директории.
- GLOB_NOSORT - Возвращает файлы в том виде, в котором они содержатся в директории (без сортировки). Если этот флаг не указан, то имена сортируются по алфавиту.
- GLOB_NOCHECK - Возвращает шаблон поиска, если с его помощью не был найден ни один файл.
- GLOB_NOESCAPE - Обратные слеши не экранируют мета символы.
- GLOB_BRACE - Раскрывает для совпадения с 'a', 'b' или 'c'.
- GLOB_ONLYDIR - Возвращает только директории, совпадающие с шаблоном.
- GLOB_ERR - Останавливается при ошибках чтения (например, директории без права чтения), по умолчанию ошибки игнорируются.
В последнем примере использован флаг GLOB_ONLYDIR в качестве второго аргумента функции. Поэтому в список попала, только директория "User" в имени, которой встречается "er". Функция glob() очень проста в использовании, но иногда она недостаточно гибкая. Нет флага для получения только файлов (без директорий), которые соответствуют шаблону.
Использование opendir(), readdir(), и closedir().
Следующий метод получения списка файлов и директорий, заключается в использовании PHP функций opendir(), readdir() и closedir().
Функция opendir() возвращает дескриптор открытой директории. После того как дескриптор получен, можно использовать функцию readdir(). При обращении к дескриптору функция readdir() выдает имя следующего файла или директории. Если все элементы содержащиеся в дескрипторе уже были перечислены, функция readdir() вернет false. Для закрытия дескриптора используем функцию closedir().
В отличие от использования php функции glob(), данный подход немного сложнее. Отсутствует возможность задать параметры фильтрации, которые помогают заранее формировать список возвращаемых имен файлов и директорий. Для получения необходимого списка файлов и директорий, фильтрацию должна быть выполнена самостоятельно.
Приведенный пример возвращает список имен файлов и директорий начинающихся на "Us": В выводе получим такой результат: Следующий пример выведет только файлы, содержащиеся в заданном каталоге. В выводе получим такой результат:Использование scandir().
Для завершения посмотрим пример использования php функции scandir(). У нее есть только один обязательный атрибут - путь к директории для чтения. Результатом работы функции является массив файлов и директорий, расположенных по заданному в аргументе пути. Как и в предыдущем примере для получения отфильтрованного списка файлов и директорий необходимо выполнить ее самостоятельно. Визуально решение получается более коротким и не требуется управление дескрипторами.
Пример показывает, как получить список файлов и каталогов, имена которых начинаются на "te": В выводе получим такой результат:Продвинутое решение c использованием PHP SPL
Более надежное решение с применением SPL итераторов FilesystemIterator, RecursiveDirectoryIterator и GlobIterator.Использование итераторов SPL.
Рассмотрим использование итераторов SPL. До того как приступить к решению задачи, немного познакомимся с php библиотекой SPL и итераторами. SPL библиотека предоставляет из себя специализированные наборы классов для объектно ориентированных структур данных, итераторов, дескрипторов файлов и прочее.
Основное преимущество итераторов заключается в том, что они являются классами и их можно расширить используя стандартный механизм php наследования классов. Еще один плюс заключается в том, что итераторы имеют собственные методы, которые могут быть полезны при решении типовых задач и все они расположены в одном месте. Посмотрим на примере использования FilesystemIterator и сравним с readdir(). Оба метода используют цикл, но в случае readdir() получится обрабатывать только строку, а FilesystemIterator может работать с объектом. В котором может содержатся дополнительная информацию о файле или директории такие как владелец, размер, права доступа и так далее.
Разумеется у PHP есть возможности для получения этой информации с помощью функций, filesize(), fileowner() и других. Но PHP как и любой язык программирования имеет свойства меняться. В PHP5 все больше прослеживается стремление задействовать концепции ООП. Поэтому лучше использовать современные методы работы с языком программирования.
Рассмотрим использование FilesystemIterator, RecursiveDirectoryIterator и GlobIterator. Первый итератор наследуется от DirectoryIterator, а остальные от FilesystemIterator. Все они имеют один и тот же конструктор, который принимает два аргумента:
- $path (обязательный): путь к пункту файловой системы, над которым совершаются операции
- $flags (не обязательный): один или несколько флагов
- FilesystemIterator::CURRENT_AS_PATHNAME Заставляет метод FilesystemIterator::current() вернуть путь.
- FilesystemIterator::CURRENT_AS_FILEINFO Заставляет метод FilesystemIterator::current() вернуть экземпляр SplFileInfo.
- FilesystemIterator::CURRENT_AS_SELF Заставляет метод FilesystemIterator::current() вернуть $this (FilesystemIterator).
- FilesystemIterator::CURRENT_MODE_MASK Маскирует FilesystemIterator::current()
- FilesystemIterator::KEY_AS_PATHNAME Заставляет метод FilesystemIterator::key() вернуть путь.
- FilesystemIterator::KEY_AS_FILENAME Заставляет метод FilesystemIterator::key() вернуть имя файла.
- FilesystemIterator::FOLLOW_SYMLINKS Заставляет метод RecursiveDirectoryIterator::hasChildren() следовать символическим ссылкам.
- FilesystemIterator::KEY_MODE_MASK Маскирует FilesystemIterator::key()
- FilesystemIterator::NEW_CURRENT_AND_KEY Тоже, что FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
- FilesystemIterator::SKIP_DOTS Пропускает точечные файлы (. and ..).
- FilesystemIterator::UNIX_PATHS Заставляет все пути использовать обратный слеш в Unix-стиле, независимо от настроек системы по умолчанию.
FilesystemIterator
Использовать FilesystemIterator очень просто.
Пример показывает поиск всех файлов и каталогов, имена которых начинаются на "te".Пример использования другого итератора RegexIterator для поиска всех файлов и каталогов, имена которых заканчиваются на "t.js" или "t.php". Итератор RegexIterator используется для фильтрации результата и использует механизм регулярных выражений.
RecursiveDirectoryIterator
Итератор RecursiveDirectoryIterator обеспечивает интерфейс для рекурсивного прохода по директориям файловой системы. Он имеет несколько полезных методов, таких как getChildren() и hasChildren(), которые возвращают итератор для текущего места, если это директория, и проверяют, является ли текущая точка входа директорией.
Пример демонстрирует использование RecursiveDirectoryIterator и getChildren(). В выводе получим такой результат в данном случае - это файл из директории "User":GlobIterator
Итератор GlobIterator выполняет проход по файловой аналогично функции glob(). Первый атрибут может включать шаблон имени.
Пример демонстрирует использование GlobIterator с тем же результатом, что и ранее. В выводе получим такой результат:Заключение
В приведенных выше примерах были рассмотрены различные методы PHP для достижения одной и той же цели: получение списка файлов и директорий.
Доброго времени суток. В данной статье мы остановимся на выводе списка файлов и подкаталогов в определенном каталоге при помощи PHP. В PHP существует несколько способов вывода списка файлов в каталоге. Но мы рассмотрим один из них, использующий функцию scandir. Ну, что ж приступим.
Функция scandir получает список файлов и каталогов, расположенных по указанному пути.
В результате мы получим массив со всеми файлами и директориями.
- directory — строка, путь к директории из которой мы хотим получить список файлов
- sorting_order — необязательный параметр, целое число, указывающий как будет отсортирован наш список, по умолчанию отсортирован в алфавитном порядке.
Давайте рассмотрим пример.
Создадим файл и поместим в него следующий, код:
Сохраним и перейдем на этот файл:
Как видим мы получили список файлов в алфавитном порядке.
Отлично, теперь давайте выведем список файлов и директорий отсортированных в алфавитном порядке, но по убыванию.
Сегодня я хочу рассказать вам о разнообразных ситуациях, в которых требуется загрузка файлов на сайт с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .
Простая загрузка файлов на сайт при помощи PHP
Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:
Читайте также: