Работа с директориями в PHP

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

$dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder';
if (!is_dir($dir)) {
	mkdir($dir, 0777, True);
}
PHP

То же самое делает функция scandir(), разница в том что у нее в массиве будут «.», «..» и есть возможность сортировки.

function list_files($path)
{
	if ($path[mb_strlen($path) - 1] != '/') {
		$path .= '/';
	}

	$files = array();
	$dh = opendir($path);
	while (false !== ($file = readdir($dh))) {
		if ($file != '.' && $file != '..' && !is_dir($path.$file) && $file[0] != '.') {
			$files[] = $file;
		}
	}

	closedir($dh);
	return $files;
}

print_r(list_files(__DIR__));
PHP

Результат:

Array
(
    [0] => favicon.ico
    [1] => index.php
    [2] => image.jpg
    [3] => robots.txt
)

Функция rmdir($dir) — удаляет заданную директорию только при условии, если она пуста.

$dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder';
rmdir($dir);
PHP

Удалить директорию со всем содержимым

function remove_dir($dir)
{
	if ($objs = glob($dir . '/*')) {
		foreach($objs as $obj) {
			is_dir($obj) ? remove_dir($obj) : unlink($obj);
		}
	}
	rmdir($dir);
}

$dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder';
remove_dir($dir);
PHP

Удалить только содержимое директории

function clear_dir($dir, $rmdir = false)
{
	if ($objs = glob($dir . '/*')) {
		foreach($objs as $obj) {
			is_dir($obj) ? clear_dir($obj, true) : unlink($obj);
		}
	}
	if ($rmdir) {
		rmdir($dir);
	}
}

$dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder';
clear_dir($dir);
PHP

Удалить файлы из директории, кроме некоторых

Например, нужно удалить все файлы, кроме файла .htaccess:

$dir = __DIR__ . '/cache';
$leave = array('index.html', '.htaccess');
		
foreach (glob($dir . '/*') as $file) {
if (!in_array(basename($file), $leave) && is_file($file)) {
	unlink($file);
}
PHP
function copy_dir($src, $drc)
{
	$dir = opendir($src);
	
	if (!is_dir($drc)) {
		mkdir($drc, 0777, true);
	}

	while (false !== ($file = readdir($dir))) {
		if ($file != '.' && $file != '..') {
			if (is_dir($src . '/' . $file)) {
				copy_dir($src . '/' . $file, $drc . '/' . $file);
			} else {
				copy($src . '/' . $file, $drc . '/' . $file);
			}
		}
	}

	closedir($dir);
}
PHP
07.11.2016, обновлено 18.12.2021
17633
Предыдущая запись Вычисление процентов в PHP
Следующая запись Вывод списка по алфавиту

Комментарии 2

Лёша Рубцов Лёша Рубцов
22 апреля 2021 в 09:27
0
То же самое, но с чёрным списком.
// Очистка директории
function dir_clear ($dir, $blacklist = []) {
function dir_clear_run($dir, $blacklist, $super_dir) {
$objs = glob($dir . '/*');
if (!$objs)
return;
foreach ($objs as $obj) {
// Проверка на наличие файла в чёрном списке
if (in_array(str_replace("$super_dir/", '', $obj), $blacklist))
continue;
// Удаление объекта
if (is_dir($obj)) {
dir_clear_run($obj, $blacklist, $super_dir);
rmdir($obj);
} else
unlink($obj);
}
}
dir_clear_run($dir, $blacklist, $dir);
}
// Создание каталога $drc и помещение в него копии содержимого каталога $src
function dir_copy($src, $drc, $blacklist = []) {
function dir_copy_run($src, $drc, $blacklist, $super_dir) {
$dir = opendir($src);
if (!is_dir($drc))
mkdir($drc, 0777, true);
while (true) {
$file = readdir($dir);
if ($file === false)
break;
if ($file == '.' || $file == '..')
continue;
// Проверка на наличие файла в чёрном списке
if (in_array(str_replace("$super_dir/", '', "$src/$file"), $blacklist))
continue;
if (is_dir("$src/$file"))
dir_copy_run("$src/$file", "$drc/$file", $blacklist, $super_dir);
else
copy("$src/$file", "$drc/$file");
}
closedir($dir);
}
dir_copy_run($src, $drc, $blacklist, $src);
}
Пример использования (обновление сайта на .ru домене):
$online = '/home/a/admin/apolshop.online/public_html';
$ru = '/home/a/admin/apolshop.ru/public_html';
// Проверка происходит относительно переданной директории в первом аргументе
// Значит можно указывать подпапки, например: 'products/resources/imgs'
$blacklist = [
'.htaccess',
'cgi-bin',
'imgs',
'service',
'test',
'staticValues.php'
];
dir_clear($ru, $blacklist); // Очистка .ru
dir_copy($online, $ru, $blacklist); // Копирование из .online в .ru

Спасибо автору
Rob Roy Rob Roy
1 декабря 2021 в 11:59
0
Получить список файлов директории в виде массива без «.», «..» (онлайнер):
$fileList = array_diff( scandir( $dir ), array( '..', '.' ) );

, чтобы добавить комментарий.

Другие публикации

Выпадающий список с файлами на хостинге
Примеры как сделать select для выбора загруженных файлов. Из PHP-функций для работы с файловой системой – opendir(),...
3408
+2
Поиск файлов в PHP
Для поиска файлов на сервере хорошо подходит функция glob(), которая возвращает список файлов по заданной маске, например...
10756
0
Синхронизация файлов между сайтами
Такой вопрос возникает когда у сайта есть копия, например региональный сайт или сайт на другом языке, но при этом база...
2201
+1
Работа с именами файлов в PHP
Набор PHP функций для работы с путями и именами файлов.
2341
+2
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
7044
+1
ZIP в PHP (ZipArchive)
Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.
10641
+4