Часто в PHP нужно вывести все файлы и каталоги в виде списка…это нужно, чтобы нам сразу узнать где у нас, чего и сколько…давайте приступать…
Сегодня saitsozdanie.ru рассмотрит несколько способов:
1 способ) Выводим только файлы с расширением php (например)
$filelist = glob("*.php");
foreach ($filelist as $filename){
echo $filename." и его размер: ".filesize($filename)." байт <br>";
}
Также можно вывести файлы любого расширения txt например и тд. Дело в том, что функция glob() — предназначена для вывода по шаблону. (Если поставить так me* — то будут выводиться все файлы начинающиеся на «me»)
2 способ) Выводим все файлы в данной папке:
$path = ".";
$filelist = array();
if($handle = opendir($path)){
while($entry = readdir($handle)){
echo $entry."<br>";
}
closedir($handle);
}
Тут мы используем функции opendir(), для открытия файла…далее можно сразу использовать функцию readdir(), которая шаг за шагом будет считывать по одному файлу и наполнять наш массивчик $filelist, и в конце закрываем открытую папочку с помощью функции closedir(). Если в $path = «.» вместо точки поставить files — то будут считываться все файлы из папки по имени files.
3 способ) Задействуем функцию scandir()
Функция scandir() — принимает лишь путь или место, где нужно искать и получает массив с данными, который перебрав можно получить файлы и папки в алфавитном порядке. scandir(«.») — будет искать в той же категории, что и сам исполняемый файл.
$path = scandir("files");
foreach($path as $k){
echo $k."<br>";
}
4 способ) использование функции с задействованием цикла for
function nav($dir){
if(is_dir($dir)){
$files = scandir($dir);
array_shift($files); // удаляем из массива '.'
array_shift($files); // удаляем из массива '..'
for($i=0; $i<sizeof($files); $i++){
$len = $files[$i];
echo $len."<br>";
}
}
}
$dir = "files";
nav($dir);
5способ) Ну и напоследок самый верный по мнению многих профессионалов способ для чтения каталога на php:
$dir = "files";
if($handle = opendir($dir)){
while(false !== ($file = readdir($handle))) {
if($file != "." && $file != ".."){
echo $file."<br>";
}
}
}
Какой вам проще выбирайте.
saitsozdanie.ru
Here is my recursive function, placing directories into new array keys and its contents within.
/* find_files( string, &array )
** Recursive function to return a multidimensional array of folders and files
** that are contained within the directory given
*/
function find_files($dir, &$dir_array)
{
// Create array of current directory
$files = scandir($dir);
if(is_array($files))
{
foreach($files as $val)
{
// Skip home and previous listings
if($val == '.' || $val == '..')
cont.
nbsp;
find_files($dir.'/'.$val, $dir_array);
}
else
{
$dir_array[$dir][] = $val;
}
}
}
ksort($dir_array);
}
// Example
$folder_list = array();
find_files('/path', $folder_list)
var_dump($folder_list);
array(3) {
["directory_01"]=>
array(4) {
[0]=>
string(12) "directory_02"
[1]=>
string(12) "directory_03"
[2]=>
string(11) "file_01.txt"
[3]=>
string(11) "f.
de>
php.net
Поздно к показу, но чтобы откорректировать принятый ответ …
Если вы хотите, чтобы все файлы и каталоги находились в виде массива (это можно красиво сочетать с JSON.stringify в javascript), вы можете изменить функцию:
function listFolderFiles($dir) { $arr = array(); $ffs = scandir($dir); foreach($ffs as $ff) { if($ff != '.' && $ff != '..') { $arr[$ff] = array(); if(is_dir($dir.'/'.$ff)) { $arr[$ff] = listFolderFiles($dir.'/'.$ff); } } } return $arr; }
Для новичков…
Чтобы использовать вышеупомянутый JSON.stringify
, ваш JS/jQuery будет выглядеть примерно так:
var ajax = $.ajax({ method: 'POST', data: {list_dirs: true} }).done(function(msg) { $('pre').html( 'FILE LAYOUT<br/>' + JSON.stringify(JSON.parse(msg), null, 4) ); });
^ Предполагается, что в вашем HTML-элементе есть элемент <pre>
. Любой аромат AJAX будет делать, но я считаю, что большинство людей используют что-то похожее на jQuery выше.
И сопровождающий PHP:
if(isset($_POST['list_dirs'])) { echo json_encode(listFolderFiles($rootPath)); exit(); }
где у вас уже есть listFolderFiles
.
В моем случае я установил $rootPath
в корневой каталог сайта…
$rootPath; if(!isset($rootPath)) { $rootPath = $_SERVER['DOCUMENT_ROOT']; }
Конечный результат — это что-то вроде…
| some_file_1487.smthng [] | some_file_8752.smthng [] | CSS | | some_file_3615.smthng [] | | some_file_8151.smthng [] | | some_file_7571.smthng [] | | some_file_5641.smthng [] | | some_file_7305.smthng [] | | some_file_9527.smthng [] | | IMAGES | | some_file_4515.smthng [] | | some_file_1335.smthng [] | | some_file_1819.smthng [] | | some_file_9188.smthng [] | | some_file_4760.smthng [] | | some_file_7347.smthng [] | | JSScripts | | some_file_6449.smthng [] | | some_file_7864.smthng [] | | some_file_3899.smthng [] | | google-code-prettify | | | some_file_2090.smthng [] | | | some_file_5169.smthng [] | | | some_file_3426.smthng [] | | | some_file_8208.smthng [] | | | some_file_7581.smthng [] | | | some_file_4618.smthng [] | | | | some_file_3883.smthng [] | | some_file_3713.smthng [] ... and so on...
Примечание. Это будет выглядеть не так: я изменил JSON.stringify
, чтобы отображать вкладки (вертикальные трубы), выровнять все ключевые значения, удалить цитаты с клавиш и пару других вещей. Я изменю этот ответ со ссылкой, если я когда-нибудь доберусь до его загрузки или получаю достаточный интерес.
qaru.site
Приветствую! Сегодня я хотел бы поделится решением проблемы поиска файлов с которой мне пришлось столкнутся по работе.
Описание проблемы.
Передо мной стояла задача получить список файлов(путей) в какой то определенной директории. Результат должен иметь вид массива который я смог бы в дальнейшем перебрать.
Случай был не самый простой и я приступил к реализации решения.
Решение.
Далее я распишу ход процесса и буду снабжать участки кода комментариями.
Начинаем мы с того что получим путь до нужной нам директории. Методы получения пути до нее у вас могут отличаться.
$dirPath = $_SERVER['DOCUMENT_ROOT'].'/uploads/needle_dir';
Путь по которому будем искать файлы у нас есть, теперь приступим к написанию функции для поиска по этому пути.
Для начала мы создадим массив в который будут помещаться наши пути до файлов. Этот массив будет динамически наполняться нашей функцией в процессе обхода директории.
Для этого нам необходимо передать в функцию сам путь и созданный ранее массив. Для того чтобы все складывалось в ранее созданный массив необходимо указать ссылку на него в параметрах функции.
Вот как это выглядит:
function findFilesFromDirectory($path, &$files) { } $dirPath = $_SERVER['DOCUMENT_ROOT'].'/uploads/needle_dir'; $files = []; findFilesFromDirectory($dirPath, $files);
Итак. Каркас функции у нас есть, приступим к её наполнению.
Для начала нам нужно проверять имеющийся у нас путь на то является он директорией или файлом.
function findFilesFromDirectory($path, &$files) { if (is_dir($path)) { //если переданный путь является директорией то мы продолжаем проверку } else if (is_file($path)) { //если же это файл то возвращаем путь до него. return $path; } }
Предположим что наш путь является папкой, далее на нужно разбить этот путь на входящие в него файлы и папки.
В этом нам может помочь отличная php функция scandir ($path). Она анализирует переданный путь и возвращает массив содержащий в себе названия папой и файлов находящихся по переданному пути.
Так же эта функция возвращает в массиве 2 значения в виде одинарной точки и двойной, они присутствуют во всех директориях, и использованы для того чтобы сослаться к самой директории и своему сразу родителю.
В нашем случае они не нужны и мы удаляем их из результата работы scandir ($path).
function findFilesFromDirectory($path, &$files) { if (is_dir($path)) { $cleanPath = array_diff(scandir($path), array('.', '..')); } else if (is_file($path)) { return $path; } }
Теперь у нас есть массив содержащий данные вида: [‘files’ , ‘file.js’ , ‘index.html’]. Нас это устраивает и мы можем переходить к этапу перебора этого массива.
function findFilesFromDirectory($path, &$files) { if (is_dir($path)) { $cleanPath = array_diff(scandir($path), array('.', '..')); foreach ($cleanPath as $file) { /* Соединяем $file с изначальным путем чтобы получить строку вида: * urltodir/files/morefiles */ $finalPath = $path. '/' . $file; } } else if (is_file($path)) { return $path; } }
Теперь у нас есть новый путь до папки в которой мы ищем файлы и нам остается только повторить поиск по новому пути и сохранять результат в массив ссылку на который мы передаем в параметры функции.
function findFilesFromDirectory($path, &$files) { if (is_dir($path)) { $cleanPath = array_diff(scandir($path), array('.', '..')); foreach ($cleanPath as $file) { $finalPath = $path.
' . $file; //Тут мы рекурсивно вызываем нашу функцию и передаем ей свежий путь до папки $result = $this->findFilesFromDirectory($finalPath, $files); /* Проверяем на то не вернул ли результат null, * если нет то создаем новый элемент массива с путем до файла. */ if (!is_null($result)) $files[] = $result; } } else if (is_file($path)) { return $path; } }
Теперь после каждого обхода функции будет создаваться новый путь до папки пока функция не переберёт весь каталог и входящие в него папки. После выполнения работы данной функции мы можем перебрать получившийся массив $files и получить нужные нам пути до файлов.
В конечно итоге наша конструкция будет выглядеть так:
function findFilesFromDirectory($path, &$files) { if (is_dir($path)) { $cleanPath = array_diff(scandir($path), array('.', '..')); foreach ($cleanPath as $file) { $finalPath = $path . '/' . $file; $result = $this->findFilesFromDirectory($finalPath, $files); if (!is_null($result)) $files[] = $result; } } else if (is_file($path)) { return $path; } } $dirPath = $_SERVER['DOCUMENT_ROOT'].'/uploads/needle_dir'; $files = []; $this->findFilesFromDirectory($dirPath, $files); foreach ($files as $file){ echo $file; // urltodir/files/somedirectory/file.js }
На этом пожалуй все. Надеюсь мой опыт будет вам полезен. Успехов!
dmkweb.ru Права на контент защищены.
dmkweb.ru
Итак, загружать файлы на сервер мы уже умеем. Но как вывести список загруженных файлов на экран.
Сегодня мы рассмотрим несколько простых примеров и изучим новые функции php, которые помогут нам работать с файловой системой, а именно считывать ее содержимое.
Первый и самый простой способ — это функция glob(). Она позволяет выводить список всех фалов или по заданному условию. Подробнее читайте ТУТ.
Например, чтобы вывести список всех файлов, нам нужно прописать:
foreach (glob("*.*") as $filename) { echo "$filename размер " . filesize($filename) . "<br>"; }
Боле сложный, но гибкий вариант, это работа функциями:
opendir() — Открывает каталог
readdir() — Получает элемент каталога
closedir() — Закрывает каталог
is_dir() — проверяет, является ли элемент папкой
Вот как это работает:
$dir = 'files//'; if (is_dir($dir)) { if ($dh = opendir($dir)) { while ($file = readdir($dh)) { echo "файл: $file <BR>"; } closedir($dh); } }
Но все то же может выполнять одна единственная функция.
scandir() — Получает список файлов и каталогов, расположенных по указанному пути. Кроме того, ей можно передавать параметр сортировки: 0 — по возрастанию и 1 — по убыванию. Если этот параметр не указать, то по умолчанию будет 0.
$dir = 'files/'; $files = scandir($dir,1 ); foreach ($files as $file){ echo "<li><a href='$dir$file'>$file</a></li> <br>"; }
Вы уже заметили, что появляются непонятные точки перед списком файлов, чтобы их убрать, используем такой вариант:
$dir = 'files/'; //пропускаем точки $skip = array('.', '..'); $files = scandir($dir); foreach($files as $file) { if(!in_array($file, $skip)) echo $file . '<br />'; }
И последним способом на сегодня будет dir — Возвращает экземпляр класса Directory. ООП мы еще не рассматривали, но это не мешает попробовать и этот вариант.
$d = dir("files/"); echo "Дескриптор: " . $d->handle . "<br>"; echo "Путь: " . $d->path . "<br>"; while (false !== ($entry = $d->read())) { echo $entry."<br>"; } $d->close();
Советую ознакомиться:
http://php.net/manual/ru/book.dir.php
http://ruseller.com/lessons.php?id=1575&rub=37
—————————-
http://m-o-n-e-t-a.ru/nikolay_2
slusar.su
Today’s:
- latex Cистема уравнений. Фигурная скобка — пример команд
- [!] Паскаль — Онлайн Учебник для начинающих изучать программирование с нуля. Справочник. Примеры кода. [Pascal]
- Linux Смена пользователя в консоли (терминал) — Как зайти под пользователем (перелогиниться)
- [!] LaTeX СПРАВОЧНИК — Примеры символов, кода, обозначений и команд [латекс, латех]
- "Черта над" символом — что означает в математике. Значения
- UPDATE Syntax
- Решение задачи №7 из главы 9
- latex Больше или равно Меньше или равно — команды, "как выводится" (с прямой и обычной чертой равенства)
- #5 Практическое задание №5 — связь "многие ко многим" (много статьей и у каждой несколько авторов)
- 1-ая аттестация (наиболее интересное из лекций) (по материалам лекций Седунова Алексея Александровича)
- python Число элементов в списке ("массиве") — длина списка — len — как узнать
- C++ проверить — можно ли из одной строки с помощью перестановок получить другую
- Задача № 19. Вывести на экран первых n простых чисел
- #3 Практическое задание №3 — Создание и использование сущности "Пользователь". Авторизация через базу данных (php, mysql)
- Помогите с задачей №3: Повторить предыдущее, но для каждого числа, начиная со второго, рядом выводить — больше ли оно предыдущег
- Буквы греческого алфавита латекс LaTeX — таблица всех букв греческого алфавита
- latex Матрица и скобки: квадратные, фигурные, круглые скобками, двойной модуль (норма) — определитель латех
- #3 Типы данных в языке Pascal. Объявление переменных. Целые числа integer. Оператор присваивания. Инициализация в Паскаль
- Пример решения. 1. Вывести на экран сумму N случайных чисел
- #1 Начало программирования. Минимальная программа. Комментарии в коде. Тело программы и операторные скобки. Паскаль
- Деплой — что это в программировании (deploy)
- latex Жирный шрифт — пример команды
- Решение задачи №6 из главы 9
- latex Квадратная, фигурная скобки Справа или с обеих сторон от системы/совокупности уравнений — примеры кода
- #2 Практическое задание №2 — Добавляем ещё одно поле в модель статьи
- #4 Практическое задание №4. Создание подкатегории и логическая связь "один ко многим"
- latex Черта над (линия сверху) — "вектор", замыкание — пример комады, кода
- Найти наибольший нетривиальный делитель натурального числа
- Ответы на вопросы второй аттестации по электородинамике фкн вгу 2011 (ОБСУЖДЕНИЕ)
- Задача на перестановку символов в строке
fkn.ktu10.com
Базовые решения
Первый набор решений основан на использовании функции glob()
, комбинации функций opendir()
, readdir()
и closedir()
, и также функции scandir()
.
Использование glob()
Первое решение базируется на использовании функции glob(),
которая позволяет выполнять поиск пути с помощью шаблонов. Функция имеет два параметра:
$pattern
(обязательный): шаблон поиска$flags
(опциональный): один или несколько флагов, описание которых можно найти в документации
Рассмотрим примеры. Для поиска в директории всех файлов и директорий, имена которых заканчиваются на .txt, следует использовать код:
Если вывести переменную $filelist
, то получим:
Если нужен список файлов и директорий, имена которых начинаются на “te”, то код будет выглядеть так:
А вывод имеет вид:
А для получения списка только директорий с именами, содержащих “ma”, используем код:
Последний пример выведет:
Обратите внимание, что в последнем примере использован флаг GLOB_ONLYDIR
в качестве второго параметра функции. Поэтому файл master.dat
исключен из списка. Хотя функция glob()
очень проста в использовании, иногда она недостаточно гибкая. Например, нет флага для получения только файлов (без директорий), которые соответствуют шаблону.
Используем opendir()
, readdir()
, и closedir()
.
Второй подход к получению списка файлов и директорий, который мы обсудим, заключается в использовании функций opendir()
, readdir()
, и closedir()
.
Функция opendir()
открывает директорию и возвращает дескриптор соединения. Как только дескриптор получен, можно использовать функцию readdir()
. С каждым обращением данная функция выдает имя следующего файла или директории внутри открытого каталога. Если все имена уже были перечислены, функция возвращает false. Для закрытия дескриптора используется функция closedir()
.
В отличие от использования функции glob()
, данный подход сложнее, так как у вас нет параметров, которые помогают фильтровать список возвращаемых имен файлов и директорий. Вы должны выполнить фильтрацию самостоятельно, чтобы получить нужный результат.
Ниже приведенный пример возвращает список имен файлов и директорий начинающихся на “te”:
При выполнении выше приведенного кода, переменная $entry
будет содержать такие включения, как “.” и “..”. Это две виртуальные директории, которые имеются в каждом каталоге файловой системы. Они представляют текущий каталог и родительский каталог соответственно.
Второй пример выводит только файлы, содержащиеся в заданном каталоге.
Пример выдаст следующее:
Использование scandir()
В завершение представим функцию scandir()
. Она имеет только один обязательный параметр: путь для чтения. Функция возвращает массив файлов и директорий, расположенных по указанному пути. Для получения списка файлов и директорий по определенному критерию нужно выполнить дополнительную фильтрацию. С другой стороны, решение получается более кратким и не требует управления дескрипторами.
Данный пример показывает, как получить список файлов и каталогов, имена которых начинаются на “te”:
Воспользуемся итераторами SPL
Теперь рассмотрим использование итераторов SPL. Но прежде, чем приступить к решению нашей задачи, проведем введение в библиотеку SPL и итераторы. Библиотека SPL предоставляет серию классов для объектно ориентированных структур данных, итераторов, дескрипторов файлов и прочее.
Одно из преимуществ итераторов заключается в том, что они являются классами и их можно расширить для удовлетворения собственных нужд. Другой плюс состоит в том, что итераторы имеют собственные методы, которые являются полезными при решении множества типовых задач и располагаются в одном месте. Посмотрите на пример использования FilesystemIterator
в сравнении с readdir()
. Оба метода применяют цикл, но в случае readdir()
вы обрабатываете только строку, а FilesystemIterator
работает с объектом, который может содержать дополнительную информацию о файле или директории (размер, владелец, права доступа и так далее).
Конечно, PHP представляет возможность для получения такой информации с помощью функций,например filesize()
и fileowner().
Но PHP5 основан на использовании концепции ООП. Поэтому лучше использовать современные методы работы с языком программирования. На нашем сайте есть уроки, посвященные работе с итераторами.
Как уже сообщалось во водной части урока, мы рассмотрим использование FilesystemIterator
, RecursiveDirectoryIterator
и GlobIterator
. Первый наследуется от DirectoryIterator
, а остальные от FilesystemIterator
. Они все имеют один и тот же конструктор, который принимает два параметра:
$path
(обязательный): путь к пункту файловой системы, над которым совершаются операции$flags
(опциональный): один или несколько флагов, перечисленных в документации
Реальное различие в данных итераторах заключается в их использовании для навигации по заданному пути.
FilesystemIterator
Использовать FilesystemIterator
очень просто. Рассмотрим в действии. Представляем два примера. Первый показывает поиск всех файлов и каталогов, имена которых начинаются на “te”. Второй пример использует другой итератор RegexIterator
для поиска всех файлов и каталогов, имена которых заканчиваются на “t.dat” или “t.php”. Итератор RegexIterator
используется для фильтрации результата на основе регулярных выражений.
Выше приведенный код выдаст результат, аналогичный предыдущим примерам.
Второй пример с применением RegexIterator
:
Он будет выводить:
RecursiveDirectoryIterator
Итератор RecursiveDirectoryIterator
обеспечивает интерфейс для рекурсивного прохода по директориям файловой системы. Он имеет несколько полезных методов, таких как getChildren()
и hasChildren()
, которые возвращают итератор для текущего места, если это директория, и проверяют, является ли текущая точка входа директорией. Следующий пример демонстрирует использование RecursiveDirectoryIterator
и getChildren()
. Результат будет такой же, как и в предыдущих примерах.
GlobIterator
Итератор GlobIterator
выполняет проход по файловой системе также, как и функция glob()
. Первый параметр может включать шаблон для имени. Пример демонстрирует использование GlobIterator
с тем же результатом, что и ранее.
Заключение
В данном уроке демонстрируется использование различных подходов для достижение одинаковой цели: получение списка файлов и директорий. Следует запомнить следующие ключевые моменты:
- Функция
glob()
является встроенным решением, но она недостаточно гибкая. - Решение на основе
opendir()
,readdir()
, иclosedir()
более сложное и требует дополнительной фильтрации, но оно более гибкое. - Функция
scandir()
требует дополнительной фильтрации, но работает без обработки дескриптора. - Если вы используете подход ООП, то следует применять библиотеку SPL. Дополнительно вы можете расширить классы своим функционалом.
- Итератор
GlobIterator
имеет функцию предварительной фильтрации, а другие используютRegexIterator
.
ruseller.com