Работа с каталогами

May 4, 2010 by admin Комментировать »

Язык РНР позволяет не просто получать информацию о существующих катало­гах в файловой системе, но и оперировать ими, а также просматривать их содер­жимое. Весь список функций по работе с каталогами можно найти в разделе офи­циальной документации "Функции для работы с файловой системой" ( www.php.net/manual/ru ref. f ilesystem.php) и "Функции для работы с ката­логами" (http: /www.php.net/manual/ru/ref.dir.php). Здесь мы рассмотрим только некоторые из них.

Для того чтобы узнать, является ли элемент файловой системы каталогом, достаточно выполнить функцию is_dir (). Формат ее записи следующий.

bool is_dir (string file_name)

Эта функция может быть полезна, например, при просмотре содержимого ката­лога для определения того, является ли его вложенный элемент файлом (функция is_f ile () ) или каталогом.

Весьма полезной может оказаться и функция mkdir (), которая создает новый каталог. Краткий формат записи данной функции следующий.

bool mkdir (string pathneime Lnt mode])

Это говорит о том, что при использовании функции mkdir () создается каталог по адресу pathname с правами доступа mode. Права доступа определяются для *nix-систем и могут выглядеть как 0700. По умолчанию присваиваются самые широкие права доступа к создаваемому каталогу — 0777. Пример создания каталога может выглядеть так.

<?php

mkdir("new_folder"); ?>

В результате выполнения данного скрипта в той же директории с ним будет соз­дан каталог new_f older. Для удаления каталогов используйте функцию rmdir (). Пример удаления каталога.

<?php

rmdir("new_folder"); ?>

Одними из наиболее интересных функций для работы с каталогами являются функции opendir (), readdir () и closedir (). Сочетание этих функций дает воз­можность получать данные о вложенных элементах каталога.

Функция opendir () создает хендлер для работы с каталогом. Эта функция по­добна fopen () при работе с файлами. Синтаксис записи функции следующий.

resource opendir (string path)

Функция readdir () возвращает очередной элемент заданного каталога, поэто­му она используется в основном в цикле (см. пример ниже). Формат ее записи сле­дующий.

string readdir (resource handler)

Для чтения в качестве параметра передается хендлер, полученный от функции opndir().

И наконец, после того как каталог открыт и из него произведено чтение, его не­обходимо закрыть, чтобы высвободить "драгоценную" память. Для этого по анало­гии с f close () используется функция closedir (). Она записывается в следую­щем формате.

void closedir (resource handler)

В параметре handler передается хендлер открытого каталога.

Для примера можно составить листинг текущего каталога (т.е. того каталога, в котором находится скрипт). При этом нужно указывать, чем является элемент — вложенным каталогом или файлом. Такой скрипт может выглядеть следующим образом.

<?php

//аргумент "." означает текущий каталог $handler = opendir(".");

while ($eleinent = readdir ($handler) ) { if (is_file($element)) {

echo $element . " (filej<br>";

}

elseif {is_dir($element)) {

echo $element " (dir)<br>";

}

else {

echo $element " (undefined)<br>";

}

}

closedir($handler); ?>

Ha выходе можно получить примерно такой список.

. (dir) .. (dir)

2clock.swf (file) cms (dir) data.txt (file) docs (dir) images (dir) index.php (file) new_folder (dir) r^php (file) style.CSS (file) test.php (file)

Как и в случае с файлами, работу с директориями можно упростить за счет воз­можностей РНР 5. В этой версии языка была добавлена функция scandir (), кото­рая замещает описанные ранее методы opendir (), readdir () и qlosedir () вме­сте взятые.

Формат записи функции следующий.

array scandir (string directory [, int sort_order])

Как видно из синтаксиса, функция возвращает массив с элементами сканируе­мого каталога. Раз это массив, то его можно перебрать с помощью функции foreach. Вот как может выглядеть решение предыдущей задачи с применением функций scandir () и foreach.

<?php

$dirdata = scandir(".");

foreach ($dirdata as $key => $element) I if (is_file($element)) {

echo $element . " (file)<br>"

)

elseif (is_dir ($eleinent) ) {

echo $eleinent . " (dir)<br>";

}

else {

echo $element ‘ (undef ined) <br>"

}

)

?>

Если в функции scandir () установить необязательный параметр sort_order в 1, то элементы каталога будут занесены в массив в порядке, обратном алфавитно­му. Такая запись scandir () может выглядеть так.

scandir(" ", 1);

Это позволит легко управлять порядком занесения элементов в массив.

Для прохода по каталогам можно также использовать возможности стандартной библиотеки SPL, а точнее итератор RecursiveDirectorylteratcr. У данного ите­ратора, который по своей сути является классом, существует несколько методов, с помощью которых можно попытаться осуществлять рекурсивный обход любой ди­ректории в файловой системе.

Методы итератора RecursiveDirectorylteratcr и пояснения к ним приведе­ны в табл. 11.3.

Таблица 11.3. Методы итератора RecursiveDirectorylterator

Метод Описание

hasChildren

Проверяет элемент на наличие потомков

getChildren

Возвращает итератор для текущей директории

(обычно для захода во вложенные директории)

key

Возвращает путь и имя файла текущего элемента

next

Осуществляет переход к следующему элементу

rewind

Возвращает курсор к начальной директории

Рассмотрим пример использования итератора. <?php

function recurseTree($oIterator) { while ($oIterator->valid()) {

if ($oIterator->isDir() && !$oIterator->isDot()) { echo $oIterator . " (Dir " . $olterator->key() ")<br>"; if ($oIterator >hasChildren()) {

recurseTree($oIterator->getChildren());

}

)

else if ($oIterator->isFile()) { echo $oIterator . " (File " . $oIterator->key() . ")<br>"; }

$olterator->next();

)

. )

recurseTree(new recursiveDirectorylterator(‘.’));

Данный скрипт выведет на экран список всех файлов и директорий, которые находятся с ним рядом, причем с учетом всех вложенных директорий. При этом для каждого элемента будут указаны метки (Dir или File) в зависимости от типа этого элемента, а также путь к нему относительно той директории, чтение которой производилось. Таким образом можно считать любую директорию на сервере неза­висимо от нахождения самого скрипта. Для этого при создании экземпляра объек­та recursiveDirectorylterator необходимо передать в качестве аргумента адрес директории в файловой системе.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты