Работа с каталогами
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")
?>
При рекурсивном вызове функции не передавайте в качестве аргументов записи "." и "..", указывающие на текущий и родительский каталоги, так как в этом случае вы можете потерять ваши данные. Пропускайте эти записи явным образом при помощи условного оператора.