Php вывести список файлов в папке
Сделать список файлов в php. Функция для создания списка файлов. Сколько способов существует создать список всех файлов и папок в другой папке через php? Получаем всё содержание папки в виде списков.
Соберем весь код сканирования папки:
$dir = $_SERVER['DOCUMENT_ROOT'].'/путь до сканируемой папки';
Скрипт с функцией scandir.
Для того, чтобы использовать функцию scandir нам потребуется. :
Чтобы сканировать папку нам нужен путь до папки. Я почти всегда использую путь на сервере. Просто потому, что этот путь никогда не меняется вне зависимости не от чего! И у вас должно получиться что-то типа:
Далее применяем функцию scandir и присвоим полученные данные(массив) произвольной переменной "$example":
Далее. нам требуется вывести значение переменной, поскольку это массив, то нам потребуется print_r:
Нумерация файлов из папки.
Выше мы уже получили файлы из папки. Напомню результат, который мы получали ранее:
Не буду создавать новые циклы. возьмем цикл оттуда же. вовнутрь помести счетчик "$count++;".
И его же добавим в строку. покрасим в
Соберем новый цикл нумерации файлов из папки:
Синтаксис Scandir.
array scandir ( string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context ]] )
Результат scandir без точек
Elitsin-Brat-Gorbacheva.html
Gorbachev-goret-tebe-v-adu.doc
Gorbachev-predatel.html
Gorbachev-prodal-rodinu.txt
Gorbachev-razvalil-SSSR.php
amerikosyi_kazlyi.txt
+ Как мы видим чуть выше - простой пример избавлении от точек при scandir -ещё можно удалить две виртуальные директории, которые вы видите в начале списка.
Примеры
$dir = '/tmp' ;
$files1 = scandir ( $dir );
$files2 = scandir ( $dir , 1 );
print_r ( $files1 );
print_r ( $files2 );
?>
Результатом выполнения данного примера будет что-то подобное:
RecursiveDirectoryIterator
Итератор RecursiveDirectoryIterator обеспечивает интерфейс для рекурсивного прохода по директориям файловой системы. Он имеет несколько полезных методов, таких как getChildren() и hasChildren() , которые возвращают итератор для текущего места, если это директория, и проверяют, является ли текущая точка входа директорией. Следующий пример демонстрирует использование RecursiveDirectoryIterator и getChildren() . Результат будет такой же, как и в предыдущих примерах.
Как нумеровать файлы в папке php с начала
Немного о том зачем!?
Предположим, что у вас есть необходимость создать файл с одинаковым названием.
При новом создании такого файла старый будет перезаписываться(если нет php запрета на перезапись уже существующего файла).
Единственный выход добавление нумерации к одинаковому названию.
Либо же требуется, . вообще, . нумеровать следующий создаваемый файл по счету.
Внимание! Функция не будет работать:
Если в папке есть хотя бы один не пронумерованный файл!
Если нумерация файлов поломана, например два фала имеют одинаковую нумерацию :
При сохранении в этой же папке новых файлов, проверяйте на существование нового создаваемого файла( is_file ) в папке во избежании потери данных!
Воспользуемся итераторами SPL
Теперь рассмотрим использование итераторов SPL. Но прежде, чем приступить к решению нашей задачи, проведем введение в библиотеку SPL и итераторы. Библиотека SPL предоставляет серию классов для объектно ориентированных структур данных, итераторов, дескрипторов файлов и прочее.
Одно из преимуществ итераторов заключается в том, что они являются классами и их можно расширить для удовлетворения собственных нужд. Другой плюс состоит в том, что итераторы имеют собственные методы, которые являются полезными при решении множества типовых задач и располагаются в одном месте. Посмотрите на пример использования FilesystemIterator в сравнении с readdir() . Оба метода применяют цикл, но в случае readdir() вы обрабатываете только строку, а FilesystemIterator работает с объектом, который может содержать дополнительную информацию о файле или директории (размер, владелец, права доступа и так далее).
Конечно, PHP представляет возможность для получения такой информации с помощью функций,например filesize() и fileowner(). Но PHP5 основан на использовании концепции ООП. Поэтому лучше использовать современные методы работы с языком программирования. На нашем сайте есть уроки, посвященные работе с итераторами.
Как уже сообщалось во водной части урока, мы рассмотрим использование FilesystemIterator , RecursiveDirectoryIterator и GlobIterator . Первый наследуется от DirectoryIterator , а остальные от FilesystemIterator . Они все имеют один и тот же конструктор, который принимает два параметра:
- $path (обязательный): путь к пункту файловой системы, над которым совершаются операции
- $flags (опциональный): один или несколько флагов, перечисленных в документации
Реальное различие в данных итераторах заключается в их использовании для навигации по заданному пути.
Расшифровка синтаксиса Scandir.
array - возвращаемое значение - массив
string $directory - string(строка), $directory(папка/директория) или другими словами. путь до папки.
Следующие параметры расшифровывать смысла нет, поскольку никогда не использовал(имхо)
Если бы я рассказывал о функции "Scandir", то предпочел бы так записать синтаксис:
scandir ( "directory" ) : array
Рекомендую еще по теме Scandir:
Дерево всех папок на сайте
Как вывести названия файлов scandir в цикле
Выше я показал, как просто вывести результат работы функции scandir с помощью print_r.
Но также, поскольку возвращаемое значение массив, то можно результат "scandir" вывести с помощью цикла:
Для того, чтобы вывести содержимое папки, которое уже отсканировалось нам понадобится.
Опять же. создать путь до папки для сканирования.
Далее применим опять функцию scandir :
Далее нам потребуется цикл:
Соберем весь код для вывода сканированной папки в массиве:
GlobIterator
Итератор GlobIterator выполняет проход по файловой системе также, как и функция glob() . Первый параметр может включать шаблон для имени. Пример демонстрирует использование GlobIterator с тем же результатом, что и ранее.
User Contributed Notes 7 notes
I wrote a simple backup script which puts all files in his folder (and all of the sub-folders) in one TAR archive.
(It's classic TAR format not USTAR, so filename and path to it can't be longer then 99 chars)
/***********************************************************
* Title: Classic-TAR based backup script v0.0.1-dev
**********************************************************/
Class Tar_by_Vladson var $tar_file ;
var $fp ;
function Tar_by_Vladson ( $tar_file = 'backup.tar' ) $this -> tar_file = $tar_file ;
$this -> fp = fopen ( $this -> tar_file , "wb" );
$tree = $this -> build_tree ();
$this -> process_tree ( $tree );
fputs ( $this -> fp , pack ( "a512" , "" ));
fclose ( $this -> fp );
>
function build_tree ( $dir = '.' ) $handle = opendir ( $dir );
while( false !== ( $readdir = readdir ( $handle ))) if( $readdir != '.' && $readdir != '..' ) $path = $dir . '/' . $readdir ;
if ( is_file ( $path )) $output [] = substr ( $path , 2 , strlen ( $path ));
> elseif ( is_dir ( $path )) $output [] = substr ( $path , 2 , strlen ( $path )). '/' ;
$output = array_merge ( $output , $this -> build_tree ( $path ));
>
>
>
closedir ( $handle );
return $output ;
>
function process_tree ( $tree ) foreach( $tree as $pathfile ) if ( substr ( $pathfile , - 1 , 1 ) == '/' ) fputs ( $this -> fp , $this -> build_header ( $pathfile ));
> elseif ( $pathfile != $this -> tar_file ) $filesize = filesize ( $pathfile );
$block_len = 512 * ceil ( $filesize / 512 )- $filesize ;
fputs ( $this -> fp , $this -> build_header ( $pathfile ));
fputs ( $this -> fp , file_get_contents ( $pathfile ));
fputs ( $this -> fp , pack ( "a" . $block_len , "" ));
>
>
return true ;
>
function build_header ( $pathfile ) if ( strlen ( $pathfile ) > 99 ) die( 'Error' );
$info = stat ( $pathfile );
if ( is_dir ( $pathfile ) ) $info [ 7 ] = 0 ;
$header = pack ( "a100a8a8a8a12A12a8a1a100a255" ,
$pathfile ,
sprintf ( "%6s " , decoct ( $info [ 2 ])),
sprintf ( "%6s " , decoct ( $info [ 4 ])),
sprintf ( "%6s " , decoct ( $info [ 5 ])),
sprintf ( "%11s " , decoct ( $info [ 7 ])),
sprintf ( "%11s" , decoct ( $info [ 9 ])),
sprintf ( "%8s" , " " ),
( is_dir ( $pathfile ) ? "5" : "0" ),
"" ,
""
);
clearstatcache ();
$checksum = 0 ;
for ( $i = 0 ; $i < 512 ; $i ++) $checksum += ord ( substr ( $header , $i , 1 ));
>
$checksum_data = pack (
"a8" , sprintf ( "%6s " , decoct ( $checksum ))
);
for ( $i = 0 , $j = 148 ; $i < 7 ; $i ++, $j ++)
$header [ $j ] = $checksum_data [ $i ];
return $header ;
>
>
header ( 'Content-type: text/plain' );
$start_time = array_sum ( explode ( chr ( 32 ), microtime ()));
$tar = & new Tar_by_Vladson ();
$finish_time = array_sum ( explode ( chr ( 32 ), microtime ()));
printf ( "The time taken: %f seconds" , ( $finish_time - $start_time ));
?>
Here is a very similar function to *scandir*, if you are still using PHP4.
This recursive function will return an indexed array containing all directories or files or both (depending on parameters). You can specify the depth you want, as explained below.
// $path : path to browse
// $maxdepth : how deep to browse (-1=unlimited)
// $mode : "FULL"|"DIRS"|"FILES"
// $d : must not be defined
function searchdir ( $path , $maxdepth = - 1 , $mode = "FULL" , $d = 0 )
if ( substr ( $path , strlen ( $path ) - 1 ) != '/' ) < $path .= '/' ; >
$dirlist = array () ;
if ( $mode != "FILES" ) < $dirlist [] = $path ; >
if ( $handle = opendir ( $path ) )
while ( false !== ( $file = readdir ( $handle ) ) )
if ( $file != '.' && $file != '..' )
$file = $path . $file ;
if ( ! is_dir ( $file ) ) < if ( $mode != "DIRS" ) < $dirlist [] = $file ; >>
elseif ( $d >= 0 && ( $d < $maxdepth || $maxdepth < 0 ) )
$result = searchdir ( $file . '/' , $maxdepth , $mode , $d + 1 ) ;
$dirlist = array_merge ( $dirlist , $result ) ;
>
>
>
closedir ( $handle ) ;
>
if ( $d == 0 ) < natcasesort ( $dirlist ) ; >
return ( $dirlist ) ;
>
To join directory and file names in a cross-platform manner you can use the following function.
function join_path()
$num_args = func_num_args();
$args = func_get_args();
$path = $args[0];
It should do the following:
$src = join_path( '/foo', 'bar', 'john.jpg' );
echo $src; // On *nix -> /foo/bar/john.jpg
I would like to present these two simple functions for generating a complete directory listing - as I feel the other examples are to restrictive in terms of usage.
Usage is as simple as this:
$dir = "";
$arDirTree = dirTree($dir);
printTree($arDirTree);
It is easy to add files to the tree also - so enjoy.
Samba mounts under a Windows environment are not accessible using the mounted drive letter. For instance, if you have drive X: in Windows mounted to //example.local/shared_dir (where example.local is a *nix box running Samba), the following constructs
$dir = "X:\\data\\";
$handle = opendir( $dir );
or
$d = dir( $dir );
will return a warning message "failed to open dir: No error"
On the other hand, using the underlying mapping info works just fine. For example:
$dir = "//example.local/shared_dir/data";
$handle = opendir( $dir );
or
$d = dir( $dir );
Both cases do what they're expected to.
Mine works as long as the samba volume is actually mounted. Having it listed in the "My Computer" window doesn't warrant that.
I have posted this same observation in scandir, and found out that it is not limited to scandir alone but to ALL directory functions.
В данном уроке мы разберемся с типовой задачей, которая возникает во время работы над проектом PHP: получение списка файлов и директорий. Обсудим несколько базовых и более изощренных подходов, с перечисление плюсов и минусов каждого. Первые три решения будут использовать типовые функции PHP, а затем представим более надежное с применением итераторов SPL.
Для предметного обсуждения решения и демонстраций предположим, что структура директорий имеет следующий вид:
Использование scandir()
В завершение представим функцию scandir() . Она имеет только один обязательный параметр: путь для чтения. Функция возвращает массив файлов и директорий, расположенных по указанному пути. Для получения списка файлов и директорий по определенному критерию нужно выполнить дополнительную фильтрацию. С другой стороны, решение получается более кратким и не требует управления дескрипторами.
Данный пример показывает, как получить список файлов и каталогов, имена которых начинаются на “te”:
Содержание
-
— Изменяет каталог — Изменяет корневой каталог — Закрывает дескриптор каталога — Возвращает экземпляр класса Directory — Получает имя текущего рабочего каталога — Открывает дескриптор каталога — Получает элемент каталога по его дескриптору — Сбросить дескриптор каталога — Получает список файлов и каталогов, расположенных по указанному пути
Как использовать функцию для нумерации файлов с начала?
Для того, чтобы пронумеровать следующий файл из папки нам потребуется:
У вас должно получиться что-то типа:
Далее применим функцию, которая и получит следующий порядковый номер файла из папки. для вывода используем echo
FilesystemIterator
Использовать FilesystemIterator очень просто. Рассмотрим в действии. Представляем два примера. Первый показывает поиск всех файлов и каталогов, имена которых начинаются на “te”. Второй пример использует другой итератор RegexIterator для поиска всех файлов и каталогов, имена которых заканчиваются на “t.dat” или “t.php”. Итератор RegexIterator используется для фильтрации результата на основе регулярных выражений.
Выше приведенный код выдаст результат, аналогичный предыдущим примерам.
Второй пример с применением RegexIterator :
Он будет выводить:
Пример вывода функции scandir.
Скрипт с использованием функции scandir - выше я написал, теперь давайте попробуем использовать здесь.
Я написал путь до нашей папки, к которой применим функцию scandir:
Не смотрите на страшный путь. делал очень давно! смайлы Ссылка на сканируемую папку
Далее . как в скрипте:
Смотрите также
- opendir() - Открывает дескриптор каталога
- readdir() - Получает элемент каталога по его дескриптору
- glob() - Находит файловые пути, совпадающие с шаблоном
- is_dir() - Определяет, является ли имя файла директорией
- sort() - Сортирует массив по возрастанию
Список параметров
По умолчанию сортировка производится в алфавитном порядке по возрастанию. Если необязательный параметр sorting_order установлен в значение SCANDIR_SORT_DESCENDING , сортировка производится в алфавитном порядке по убыванию. Если же он установлен в значение SCANDIR_SORT_NONE , то сортировка не производится.
За описанием параметра context обратитесь к разделу Потоки данного руководства.
Код нумерации файлов из папки при выводе:
while (false !== ($file = readdir($handle)))
Получить список файлов в папке php -> scandir
Для того, чтобы получить список файлов в паке с помощью scandir, нам потребуется несколько предварительных телодвижений сделать
Нам нужен путь на сервере до корневой папки, у меня эта конструкция в самом верху сайта:
Далее соединим путь на сервере с путем от корневой до файла:
Применим к данной переменной и получим список всех элементов в папке:
Выведем список файлов из папки с помощью print_r:
Соберем весь код вместе:
$dir = $home . '/__a-data/Z-arhiv/scandir-ili-sodergimoe-v-papke/1/';
Возвращаемые значения
Пример вывода пронумерованных файлов из папки:
Поместим вышеприведенный код нумерации файлов из папки прямо здесь:
Пример №1 нумерации файлов из папки с помощью функции.
Что будем делать?
Создам папку с файлами №1.
Мы уже получали список файлов, выведем список всех файлов из этой папки.
Нам опять потребуется путь до папки на сервере. выше мы уже разбирали:
Применим к данному пути функцию "next_num"
Если вы посмотрите выше, то вы увидите, что нулевого файла не существует. следующий файл будет нулевой.
За описанием сопутствующих функций, таких как dirname() , is_dir() , mkdir() и rmdir() , обратитесь к главе Файловая система.
Php сканировать(scandir) папку без точек
Если вы посмотрите на результат сканирования папки выше пунктом, то вы увидите в двух первых строчках - виртуальные директории, которые естественно - всегда вам будут мешаться!
Базовые решения
Первый набор решений основан на использовании функции glob() , комбинации функций opendir() , readdir() и closedir() , и также функции scandir() .
Список изменений
Версия | Описание |
---|---|
8.0.0 | context теперь допускает значение null. |
Результат получения списка файлов из папки с помощью scandir
О нумерации файлов в папке.
С некоторыми нюансами приведенный выше тезис можно понять двумя смыслами:
При получении файлов из папки требуется их пронумеровать.
При сохранении файлов в папке требуется нумеровать файлы.
Использование glob()
Первое решение базируется на использовании функции glob(), которая позволяет выполнять поиск пути с помощью шаблонов. Функция имеет два параметра:
- $pattern (обязательный): шаблон поиска
- $flags (опциональный): один или несколько флагов, описание которых можно найти в документации
Рассмотрим примеры. Для поиска в директории всех файлов и директорий, имена которых заканчиваются на .txt, следует использовать код:
Если вывести переменную $filelist , то получим:
Если нужен список файлов и директорий, имена которых начинаются на “te”, то код будет выглядеть так:
А вывод имеет вид:
А для получения списка только директорий с именами, содержащих “ma”, используем код:
Последний пример выведет:
Обратите внимание, что в последнем примере использован флаг GLOB_ONLYDIR в качестве второго параметра функции. Поэтому файл master.dat исключен из списка. Хотя функция glob() очень проста в использовании, иногда она недостаточно гибкая. Например, нет флага для получения только файлов (без директорий), которые соответствуют шаблону.
Результат работы цикла после сканирования папки:
.
..
Elitsin-Brat-Gorbacheva.html
Gorbachev-goret-tebe-v-adu.doc
Gorbachev-predatel.html
Gorbachev-prodal-rodinu.txt
Gorbachev-razvalil-SSSR.php
amerikosyi_kazlyi.txt
Функция для нумерации файлов в папке php с начала
Примечания
Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen() . Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.
Заключение
В данном уроке демонстрируется использование различных подходов для достижение одинаковой цели: получение списка файлов и директорий. Следует запомнить следующие ключевые моменты:
- Функция glob() является встроенным решением, но она недостаточно гибкая.
- Решение на основе opendir() , readdir() , и closedir() более сложное и требует дополнительной фильтрации, но оно более гибкое.
- Функция scandir() требует дополнительной фильтрации, но работает без обработки дескриптора.
- Если вы используете подход ООП, то следует применять библиотеку SPL. Дополнительно вы можете расширить классы своим функционалом.
- Итератор GlobIterator имеет функцию предварительной фильтрации, а другие используют RegexIterator .
Вывод scandir без точек
Как вывести содержание папки без точек при использовании функции scandir
Во время цикла нужно сделать соответствующее условие!
Если ячейка массива не будет равна одной или двум точкам. остальное выводим на экран!
Используем opendir() , readdir() , и closedir() .
Второй подход к получению списка файлов и директорий, который мы обсудим, заключается в использовании функций opendir() , readdir() , и closedir() .
Функция opendir() открывает директорию и возвращает дескриптор соединения. Как только дескриптор получен, можно использовать функцию readdir() . С каждым обращением данная функция выдает имя следующего файла или директории внутри открытого каталога. Если все имена уже были перечислены, функция возвращает false. Для закрытия дескриптора используется функция closedir() .
В отличие от использования функции glob() , данный подход сложнее, так как у вас нет параметров, которые помогают фильтровать список возвращаемых имен файлов и директорий. Вы должны выполнить фильтрацию самостоятельно, чтобы получить нужный результат.
Ниже приведенный пример возвращает список имен файлов и директорий начинающихся на “te”:
При выполнении выше приведенного кода, переменная $entry будет содержать такие включения, как “.” и “..”. Это две виртуальные директории, которые имеются в каждом каталоге файловой системы. Они представляют текущий каталог и родительский каталог соответственно.
Второй пример выводит только файлы, содержащиеся в заданном каталоге.
Пример выдаст следующее:
Результат использования функции scandir.
Теперь возьмем весь код и разместим прямо здесь на страница:
5 последних уроков рубрики "PHP"
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Возвращает массив ( array ), содержащий имена файлов и каталогов, расположенных по пути, переданном в параметре directory .
Результат получения списка файлов с помощью -> opendir + readdir
User Contributed Notes 37 notes
Easy way to get rid of the dots that scandir() picks up in Linux environments:
$directory = '/path/to/my/directory' ;
$scanned_directory = array_diff ( scandir ( $directory ), array( '..' , '.' ));
?>
Here is my 2 cents. I wanted to create an array of my directory structure recursively. I wanted to easely access data in a certain directory using foreach. I came up with the following:
function dirToArray ( $dir )
$cdir = scandir ( $dir );
foreach ( $cdir as $key => $value )
<
if (! in_array ( $value ,array( "." , ".." )))
<
if ( is_dir ( $dir . DIRECTORY_SEPARATOR . $value ))
<
$result [ $value ] = dirToArray ( $dir . DIRECTORY_SEPARATOR . $value );
>
else
<
$result [] = $value ;
>
>
>
return $result ;
>
?>
Output
Array
(
[subdir1] => Array
(
[0] => file1.txt
[subsubdir] => Array
(
[0] => file2.txt
[1] => file3.txt
)
)
[subdir2] => Array
(
[0] => file4.txt
>
)
Someone wrote that array_slice could be used to quickly remove directory entries "." and "..". However, "-" is a valid entry that would come before those, so array_slice would remove the wrong entries.
Fastest way to get a list of files without dots.
$files = array_slice ( scandir ( '/path/to/directory/' ), 2 );
For directory containing files like (for example) -.jpg the results of scandir are a little "weird" ;)
$dir = '/somedir' ;
$files = scandir ( $dir );
print_r ( $files );
?>
Array
(
[0] => -.jpg
[1] => .
[2] => ..
[3] => foo.txt
[4] => somedir
)
Beware - sorting is in ASCII order :)
How i solved problem with '.' and '..'
$x = scandir__DIR__; //any directory
foreach ($x as $key => $value) if ('.' !== $value && '..' !== $value) echo $value;
>
>
Simple and working
I needed to find a way to get the full path of all files in the directory and all subdirectories of a directory.
Here's my solution: Recursive functions!
function find_all_files ( $dir )
<
$root = scandir ( $dir );
foreach( $root as $value )
<
if( $value === '.' || $value === '..' )
if( is_file ( " $dir / $value " )) < $result []= " $dir / $value " ;continue;>
foreach( find_all_files ( " $dir / $value " ) as $value )
<
$result []= $value ;
>
>
return $result ;
>
?>
Needed something that could return the contents of single or multiple directories, recursively or non-recursively,
for all files or specified file extensions that would be
accessible easily from any scope or script.
And I wanted to allow overloading cause sometimes I'm too lazy to pass all params.
class scanDir static private $directories , $files , $ext_filter , $recursive ;
// ----------------------------------------------------------------------------------------------
// scan(dirpath::string|array, extensions::string|array, recursive::true|false)
static public function scan () // Initialize defaults
self :: $recursive = false ;
self :: $directories = array();
self :: $files = array();
self :: $ext_filter = false ;
// Check we have minimum parameters
if(! $args = func_get_args ()) die( "Must provide a path string or array of path strings" );
>
if( gettype ( $args [ 0 ]) != "string" && gettype ( $args [ 0 ]) != "array" ) die( "Must provide a path string or array of path strings" );
>
// Check if recursive scan | default action: no sub-directories
if(isset( $args [ 2 ]) && $args [ 2 ] == true )
// Was a filter on file extensions included? | default action: return all file types
if(isset( $args [ 1 ])) if( gettype ( $args [ 1 ]) == "array" )< self :: $ext_filter = array_map ( 'strtolower' , $args [ 1 ]);>
else
if( gettype ( $args [ 1 ]) == "string" )< self :: $ext_filter [] = strtolower ( $args [ 1 ]);>
>
// Grab path(s)
self :: verifyPaths ( $args [ 0 ]);
return self :: $files ;
>
static private function verifyPaths ( $paths ) $path_errors = array();
if( gettype ( $paths ) == "string" )
foreach( $paths as $path ) if( is_dir ( $path )) self :: $directories [] = $path ;
$dirContents = self :: find_contents ( $path );
> else $path_errors [] = $path ;
>
>
// This is how we scan directories
static private function find_contents ( $dir ) $result = array();
$root = scandir ( $dir );
foreach( $root as $value ) if( $value === '.' || $value === '..' )
if( is_file ( $dir . DIRECTORY_SEPARATOR . $value )) if(! self :: $ext_filter || in_array ( strtolower ( pathinfo ( $dir . DIRECTORY_SEPARATOR . $value , PATHINFO_EXTENSION )), self :: $ext_filter )) self :: $files [] = $result [] = $dir . DIRECTORY_SEPARATOR . $value ;
>
continue;
>
if( self :: $recursive ) foreach( self :: find_contents ( $dir . DIRECTORY_SEPARATOR . $value ) as $value ) self :: $files [] = $result [] = $value ;
>
>
>
// Return required for recursive search
return $result ;
>
>
?>
Usage:
scanDir::scan(path(s):string|array, [file_extensions:string|array], [subfolders?:true|false]);
//Scan a single directory for all files, no sub-directories
$files = scanDir :: scan ( 'D:\Websites\temp' );
//Scan multiple directories for all files, no sub-dirs
$dirs = array(
'D:\folder' ;
'D:\folder2' ;
'C:\Other' ;
);
$files = scanDir :: scan ( $dirs );
// Scan multiple directories for files with provided file extension,
// no sub-dirs
$files = scanDir :: scan ( $dirs , "jpg" );
//or with an array of extensions
$file_ext = array(
"jpg" ,
"bmp" ,
"png"
);
$files = scanDir :: scan ( $dirs , $file_ext );
// Scan multiple directories for files with any extension,
// include files in recursive sub-folders
$files = scanDir :: scan ( $dirs , false , true );
// Multiple dirs, with specified extensions, include sub-dir files
$files = scanDir :: scan ( $dirs , $file_ext , true );
?>
Scandir on steroids:
For when you want to filter your file list, or only want to list so many levels of subdirectories.
function dirList ( $path = "" , $types = 2 , $levels = 1 , $aFilter =array()) <
// returns an array of the specified files/directories
// start search in $path (defaults to current working directory)
// return $types: 2 => files; 1 => directories; 3 => both;
// $levels: 1 => look in the $path only; 2 => $path and all children;
// 3 => $path, children, grandchildren; 0 => $path and all subdirectories;
// less than 0 => complement of -$levels, OR everything starting -$levels down
// e.g. -1 => everthing except $path; -2 => all descendants except $path + children
// Remaining argument(s) is(are) a filter array(list) of regular expressions which operate on the full path.
// First character (before the '/' of the regExp) '-' => NOT.
// First character (after a possible '-') 'd' => apply to directory name
// The filters may be passed in as an array of strings or as a list of strings
// Note that output directories are prefixed with a '*' (done in the line above the return)
$dS = DIRECTORY_SEPARATOR ;
if (!( $path = realpath ( $path ? $path : getcwd ()))) return array(); // bad path
// next line rids terminating \ on drives (works since c: == c:\ on PHP). OK in *nix?
if ( substr ( $path ,- 1 )== $dS ) $path = substr ( $path , 0 ,- 1 );
if ( is_null ( $types )) $types = 2 ;
if ( is_null ( $levels )) $levels = 1 ;
if ( is_null ( $aFilter )) $aFilter =array();
// last argument may be passed as a list or as an array
$aFilter = array_slice ( func_get_args (), 3 );
if ( $aFilter && gettype ( $aFilter [ 0 ])== "array" ) $aFilter = $aFilter [ 0 ];
$adFilter = array();
// now move directory filters to separate array:
foreach ( $aFilter as $i => $filter ) // for each directory filter.
if (( $pos = stripos ( " $filter " , "d" )) && $pos < 3 ) < // next line eliminates the 'd'
$adFilter [] = substr ( $filter , 0 , $pos - 1 ) . substr ( $filter , $pos );
unset( $aFilter [ $i ]); >
$aFilter = array_merge ( $aFilter ); // reset indeces
$aRes = array(); // results, $aAcc is an Accumulator
$aDir = array( $path ); // dirs to check
for ( $i = $levels > 0 ? $levels ++:- 1 ;( $aAcc =array())|| $i --&& $aDir ; $aDir = $aAcc )
while ( $dir = array_shift ( $aDir ))
foreach ( scandir ( $dir ) as $fileOrDir )
if ( $fileOrDir != "." && $fileOrDir != ".." ) <
if ( $dirP = is_dir ( $rp = " $dir$dS$fileOrDir " ))
if ( pathFilter ( " $rp$dS " , $adFilter ))
$aAcc [] = $rp ;
if ( $i < $levels - 1 && ( $types & ( 2 - $dirP )))
if ( pathFilter ( $rp , $aFilter ))
$aRes [] = ( $dirP ? "*" : "" ) . $rp ; >
return $aRes ;
>
?>
example usage:
define ( "_" , NULL );
// this will find all non .jpg, non .Thumbs.db files under c:\Photo
$aFiles = dirList ( 'c:\Photo' , _ , 0 , '-/\.jpg$/i' , '-/\\\\Thumbs.db$/' );
$aFiles = dirList (); // find the files in the current directory
// next lines will find .jpg files in non Photo(s) subdirectories, excluding Temporary Internet Files
set_time_limit ( 60 ); // iterating from the top level can take a while
$aFiles = dirList ( "c:\\" , _ , 0 , '/\.jpg$/i' , '-d/\\\\Photos?$/i' , '-d/Temporary Internet/i' );
?>
Note that this function will consume a lot of time if scanning large
directory structures (which is the reason for the '[-]d/. /' filters).
Csaba Gabor from Vienna
scandir() with regexp matching on file name and sorting options based on stat().
function myscandir ( $dir , $exp , $how = 'name' , $desc = 0 )
<
$r = array();
$dh = @ opendir ( $dir );
if ( $dh ) <
while (( $fname = readdir ( $dh )) !== false ) <
if ( preg_match ( $exp , $fname )) <
$stat = stat ( " $dir / $fname " );
$r [ $fname ] = ( $how == 'name' )? $fname : $stat [ $how ];
>
>
closedir ( $dh );
if ( $desc ) <
arsort ( $r );
>
else <
asort ( $r );
>
>
return( array_keys ( $r ));
>
$r = myscandir ( './book/' , '/^article5\.txt$/i' , 'ctime' , 1 );
print_r ( $r );
?>
files can be sorted on name and stat() attributes, ascending and descending:
name file name
dev device number
ino inode number
mode inode protection mode
nlink number of links
uid userid of owner
gid groupid of owner
rdev device type, if inode device *
size size in bytes
atime time of last access (Unix timestamp)
mtime time of last modification (Unix timestamp)
ctime time of last inode change (Unix timestamp)
blksize blocksize of filesystem IO *
blocks number of blocks allocated
/**
* This function will scan all files recursively in the sub-folder and folder.
*
* @author Fazle Elahee
*
*/
if(!empty($lists))
foreach($lists as $f)
$path = "/var/www/SimplejQueryDropdowns";
$file_names = scanFileNameRecursivly($path);
Scandir - это функция в php, которая умеет сканировать все содержимое папки.
Список файлов из папки php с ссылкой на него
Как из списка файлов сделать список файлов с ссылками на эти файлы!?
Хотите!? Ну конечно же хотите! В чем смысл.
Зачем и где это можно применить!?
Смысл в том, что предположим у вас есть файлы в папке с контентом. Каждой папке принадлежит список, который формируется вручную!? Уже звучит глупо! Но я раньше так и делал!
Не буду вас долго мурыжить - вот эта страница формируется автоматически из всех папок, которые существуют на сайте! Достаточно удалить файл из папки, список обновится при следующей перезагрузке страницы!
Я долго шел к этому!
Мы немного отвлеклись.
Возьмем тот, же алгоритм и добавим туда немного кода и получим вот такой вариант:
В переменной $primer_url - путь до папки.
while (false !== ($file = readdir($handle)))
+ можно взять и вывести еще и название страницы, но я уже есть хочу и что-то я запарился эту страницу оформлять.
Как вывести папки без файлов php
Как вывести только папки без файлов в php! Например, есть такой вариант, проверять встреченное название в цикле на точку и разрешение файла, например ".php" или ".html"
И будем использовать substr_count для поиска совпадений.
if((!substr_count($arr[$i], ".php")) && (!substr_count($arr[$i], ".html")))
Подробно о создании списка файлов в папке php
Получить список файлов в папке php -> opendir + readdir
Для получения списка файлов из папки можно воспользоваться :
opendir - открываем папку уже в выше приведенном пункте $dir
Создаем цикл и внутри прописываем условие пока файлы не кончатся цикл продолжается.
Внутри цикла мы можем сделать любое условие для фильтрации списка файлов из папки php? соберем весь код вместе:
while (false !== ($file = readdir($handle)))
Читайте также: