Получить список файлов в папке php

Часто в 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 == '..')
       .
r][] = $val;
               
                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]=>.

  }
}

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


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector