В предыдущей главе мы узнали, как работать с файлами в PHP. Точно так же PHP также позволяет вам работать с каталогами в файловой системе, например, вы можете открыть каталоги, читать содержимое, создавать или удалять каталоги, перечислить все файлы в каталоге и так далее.
Создание нового каталога с помощью PHP-функции mkdir()
Вы можете создать новый пустой каталог, вызвав PHP-функцию mkdir()
, указав путь и имя каталога, который будет создан, как показано в примере ниже:
<?php
// Путь к каталогу
$dir = "testdir";
// Проверяем наличие каталога
if(!file_exists($dir)){
// Попытка создать каталог
if(mkdir($dir)){
echo "Directory created successfully.";
} else{
echo "ERROR: Directory could not be created.";
}
} else{
echo "ERROR: Directory already exists.";
}
?>
Чтобы функция mkdir()
работала, родительские каталоги в параметре пути к каталогу должны уже существовать, например, если вы укажете путь к каталогу как testdir/subdir
, тогда должен существовать testdir
, иначе PHP сгенерирует ошибку.
Копирование файлов из одного места в другое с помощью PHP-функции copy()
Вы можете скопировать файл из одного места в другое, вызвав PHP-функцию copy()
с исходным и конечным путями файла в качестве аргументов. Если целевой файл уже существует, он будет перезаписан. Вот пример, который создает копию файла example.txt
в папке резервного копирования (backup).
<?php
// Путь к исходному файлу
$file = "example.txt";
// Путь к конечному файлу
$newfile = "backup/example.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Пытаемся скопировать файл
if(copy($file, $newfile)){
echo "File copied successfully.";
} else{
echo "ERROR: File could not be copied.";
}
} else{
echo "ERROR: File does not exist.";
}
?>
Чтобы этот пример работал, целевой каталог, который является резервной копией и исходный файл, то есть example.txt
, должны уже существовать; в противном случае PHP выдаст ошибку.
Список всех файлов в каталоге с помощью PHP-функции scandir()
Вы можете использовать PHP-функцию scandir()
для вывода списка файлов и каталогов внутри указанного пути.
Теперь мы собираемся создать специальную функцию, которая рекурсивно перечислит все файлы в каталоге с помощью PHP. Этот сценарий будет полезен, если вы работаете с глубоко вложенной структурой каталогов.
<?php
// Определяем функцию для вывода файлов в каталог
function outputFiles($path){
// Проверяем, существует ли каталог
if(file_exists($path) && is_dir($path)){
// Сканируем файлы в этом каталоге
$result = scandir($path);
// Отфильтруем текущий (.) и родительский (..) каталоги
$files = array_diff($result, array('.', '..'));
if(count($files) > 0){
// Цикл через перенастроенный массив
foreach($files as $file){
if(is_file("$path/$file")){
// Печатаем filename
echo $file . "<br>";
} else if(is_dir("$path/$file")){
// Рекурсивно вызываем функцию, если каталоги найдены
outputFiles("$path/$file");
}
}
} else{
echo "ERROR: No files found in the directory.";
}
} else {
echo "ERROR: The directory does not exist.";
}
}
// Вызываем функцию
outputFiles("mydir");
?>
Список всех файлов определенного типа с помощью функции glob()
При работе с каталогом и файловой структурой иногда вам может потребоваться найти определенные типы файлов в каталоге, например, перечислить только файлы .text
или.png
. Вы можете легко сделать это с помощью PHP-функции glob()
, который соответствует файлам на основе шаблона.
Код PHP в следующем примере будет искать в каталоге документов и перечислять все файлы с расширением .text
. Поиск в подкаталогах не выполняется.
<?php
/* В цикле ищем совпадающие файлы */
foreach(glob("documents/*.txt") as $file){
echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>";
}
?>
Функцию glob()
также можно использовать для поиска всех файлов в каталоге или его подкаталогах. Функция, определенная в следующем примере, будет рекурсивно перечислять все файлы в каталоге, как мы это делали в предыдущем примере с функцией scandir()
.
<?php
// Определяем функцию для вывода файлов в каталог
function outputFiles($path){
// Проверяем, существует ли каталог
if(file_exists($path) && is_dir($path)){
// Ищем файлы в этом каталоге
$files = glob($path ."/*");
if(count($files) > 0){
// Запускаем цикл
foreach($files as $file){
if(is_file("$file")){
// Печатаем имя файла
echo basename($file) . "<br>";
} else if(is_dir("$file")){
// Рекурсивно вызывать функцию, если каталоги найдены
outputFiles("$file");
}
}
} else{
echo "ERROR: No such file found in the directory.";
}
} else {
echo "ERROR: The directory does not exist.";
}
}
// Вызываем функцию
outputFiles("mydir");
?>