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

Для установки текущего каталога применяется функция chdir:

int chdir ( string directory)

Работать с этой функцией можно следующим образом:
chdir("/tmp/data"); // переход по абсолютному пути
chdir("./js"); // переход в подкаталог текущего каталога
chdir(".."); // переход в родительский каталог
chdir("~/data"); // переходим в /home/пользователь/data (для Unix)

Чтобы узнать текущий каталог можно воспользоваться функцией getcwd:

string getcwd ( string path)

Для того чтобы открыть каталог используется функция opendir, открывающая каталог, заданный параметром path:

int opendir ( string path)

После того, как каталог открыт, прочитать его можно функцией readdir:

string readdir ( int dir)

Эта функция возвращает имена элементов, содержащихся в каталоге. Кроме файлов и папок в каталогах находятся также элементы "." и "..". Первый элемент указывает на текущий каталог, а второй - на родительский. Текущий каталог, кстати, можно открыть, указав его имя как ".":

$dir = opendir (".");

После того, как работа с каталогом закончена, его нужно закрыть. Закрытие каталога выполняется при помощи функции closedir:

void closedir ($dir)

Ниже приведен пример, осуществляющий чтение и вывод файлов, находящихся в текущем каталоге.

<?
$dir = opendir (".");
echo "Files:\n";
while ($file = readdir ($dir))
{
echo "$file<br>";
}
closedir ($dir);
?>

Заметим, что эта функция возвращает также "." и "..". Если этого делать не нужно, то исключить эти значения можно следующим образом:

<?
$dir = opendir (".");
while ( $file = readdir ($dir))
{
if (( $file != ".") && ($file != ".."))
{
echo "$file<br>";
}
}
closedir ($dir);
?>

В качестве примера на рассмотренные функции, давайте создадим скрипт, удаляющий все файлы из каталога c:/temp, к которым не было доступа в течение суток. Функция удаления файлов в этом случае вызывается рекурсивно.

<?
function delTemporaryFiles ($directory)
{
$dir = opendir ($directory);
while (( $file = readdir ($dir)))
{
if( is_file ($directory."/".$file))
{
$acc_time = fileatime ($directory."/".$file);
$time = time();
if (($time - $acc_time) > 24*60*60)
{
if ( unlink ($directory."/".$file))
{
echo ("Файлы успешно удалены");
}
}
}
else if ( is_dir ($directory."/".$file) && ($file != ".") && ($file != ".."))
{
delTemporaryFiles ($directory."/".$file);
}
}
closedir ($dir);
}
delTemporaryFiles ("c:/temp");
?>

Создание каталогов производится с помощью функции mkdir:

bool mkdir ( string dirname, int mode)

Эта функция создает каталог с именем dirname и правами доступа mode. В случае неудачи возвращает false. Права доступа задаются только для каталогов UNIX, поскольку в Windows этот аргумент игнорируется. Ниже приведен пример создания каталога test в директории c:/temp.

<?
$flag = mkdir ("c:/temp/test", 0700);
if($flag)
{
echo("Каталог успешно создан");
}
else
{
echo("Ошибка создания каталога");
}
?>

Удалить каталог можно с помощью функции rmdir:

bool rmdir ( string dirname)

Теперь удалим только что созданный каталог /test:

<?
$flag = rmdir ("c:/temp/test");
if($flag)
{
echo("Каталог успешно удален");
}
else
{
echo("Ошибка удаления каталога");
}
?>

Функция rmdir удаляет только пустые каталоги. Для того чтобы удалять непустые каталоги, давайте напишем функцию и удалим каталог c:/temp со всеми вложенными папками и файлами:

<?
function full_del_dir ($directory)
{
$dir = opendir($directory);
while(($file = readdir($dir)))
{
if ( is_file ($directory."/".$file))
{
unlink ($directory."/".$file);
}
else if ( is_dir ($directory."/".$file) &&
($file != ".") && ($file != ".."))
{
full_del_dir ($directory."/".$file);
}
}
closedir ($dir);
rmdir ($directory);
echo("Каталог успешно удален");
}
full_del_dir ("c:/temp")
?>

При рекурсивном вызове функции не передавайте в качестве аргументов записи "." и "..", указывающие на текущий и родительский каталоги, так как в этом случае вы можете потерять ваши данные. Пропускайте эти записи явным образом при помощи условного оператора.

<<< - Предыдущая | Cледующая ->>>