PHP вывод файлов и каталогов директории
Часто в PHP нужно вывести все файлы и каталоги в виде списка. это нужно, чтобы нам сразу узнать где у нас, чего и сколько. давайте приступать.
Сегодня saitsozdanie.ru рассмотрит несколько способов:
1 способ) Выводим только файлы с расширением php (например)
$filelist = glob(«*.php»);
foreach ($filelist as $filename) echo $filename.» и его размер: «.filesize($filename).» байт
«;
>
Также можно вывести файлы любого расширения txt например и тд. Дело в том, что функция glob() — предназначена для вывода по шаблону. (Если поставить так me* — то будут выводиться все файлы начинающиеся на «me»)
2 способ) Выводим все файлы в данной папке:
if($handle = opendir($path)) while($entry = readdir($handle)) echo $entry.»
«;
>
Тут мы используем функции opendir(), для открытия файла. далее можно сразу использовать функцию readdir(), которая шаг за шагом будет считывать по одному файлу и наполнять наш массивчик $filelist, и в конце закрываем открытую папочку с помощью функции closedir(). Если в $path = «.» вместо точки поставить files — то будут считываться все файлы из папки по имени files.
3 способ) Задействуем функцию scandir()
Функция scandir() — принимает лишь путь или место, где нужно искать и получает массив с данными, который перебрав можно получить файлы и папки в алфавитном порядке. scandir(«.») — будет искать в той же категории, что и сам исполняемый файл.
4 способ) использование функции с задействованием цикла for
function nav($dir) if(is_dir($dir)) $files = scandir($dir);
array_shift($files); // удаляем из массива ‘.’
array_shift($files); // удаляем из массива ‘..’
5способ) Ну и напоследок самый верный по мнению многих профессионалов способ для чтения каталога на php:
$dir = «files»;
if($handle = opendir($dir))
Какой вам проще выбирайте.
scandir
Возвращает array , содержащий имена файлов и каталогов, расположенных по пути, переданном в параметре directory .
Список параметров
По умолчанию, сортировка производится в алфавитном порядке по возрастанию. Если необязательный параметр sorting_order установлен в значение SCANDIR_SORT_DESCENDING , сортировка производится в алфавитном порядке по убыванию. Если же он установлен в значение SCANDIR_SORT_NONE , то сортировка не производится.
За описанием параметра context обратитесь к разделу «Потоки» данного руководства.
Возвращаемые значения
Возвращает array имен файлов в случае успеха или FALSE в случае ошибки. Если directory не является каталогом, возвращается FALSE и генерируется сообщение об ошибке уровня E_WARNING .
Список изменений
Версия | Описание |
---|---|
5.4.0 | Были добавлены sorting_order константы. Любое ненулевое значение задавало сортировку по убыванию в предыдущих версиях. Поэтому для всех версий PHP нужно использовать 0 для сортировки по возрастанию и 1 для сортировки по убыванию. Опции для режима SCANDIR_SORT_NONE не существовало до PHP 5.4.0. |
Примеры
Пример #1 Простой пример использования функции scandir()
$dir = ‘/tmp’ ;
$files1 = scandir ( $dir );
$files2 = scandir ( $dir , 1 );
?php
print_r ( $files1 );
print_r ( $files2 );
?>
Результатом выполнения данного примера будет что-то подобное:
Array ( [0] => . [1] => .. [2] => bar.php [3] => foo.txt [4] => somedir ) Array ( [0] => somedir [1] => foo.txt [2] => bar.php [3] => .. [4] => . )
Пример #2 Альтернативный вариант функции scandir() для PHP 4
$dir = «/tmp» ;
$dh = opendir ( $dir );
while ( false !== ( $filename = readdir ( $dh ))) $files [] = $filename ;
>
?php
Результатом выполнения данного примера будет что-то подобное:
Array ( [0] => . [1] => .. [2] => bar.php [3] => foo.txt [4] => somedir ) Array ( [0] => somedir [1] => foo.txt [2] => bar.php [3] => .. [4] => . )
Примечания
Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen() . Смотрите также список поддерживаемых оберток URL, их возможности, замечания по использованию и список предопределенных констант в Поддерживаемые протоколы и обработчики (wrappers).
Смотрите также
- opendir() — Открывает дескриптор каталога
- readdir() — Получает элемент каталога по его дескриптору
- glob() — Находит файловые пути, совпадающие с шаблоном
- is_dir() — Определяет, является ли имя файла директорией
- sort() — Сортирует массив
Смотрите также
За описанием сопутствующих функций, таких как dirname() , is_dir() , mkdir() и rmdir() , обратитесь к главе Файловая система.
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 ) ;
>
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.
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
$src = join_path( ‘C:\www’, ‘domain.com’, ‘foo.jpg’ );
echo $src; // On win32 -> C:\\www\\domain.com\\foo.jpg
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.
Directory functions DOES NOT currently supports Japanese characters.