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

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

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

То же самое делает функция 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
)
3

Функция 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
4
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
28735
Предыдущая запись Вычисление процентов в PHP
Следующая запись Вывод списка по алфавиту

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

Лёша Рубцов Лёша Рубцов
22 апреля 2021 в 09:27
То же самое, но с чёрным списком.
// Очистка директории
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
Получить список файлов директории в виде массива без «.», «..» (онлайнер):
$fileList = array_diff( scandir( $dir ), array( '..', '.' ) );

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

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

Выпадающий список с файлами на хостинге
Примеры как сделать select для выбора загруженных файлов. Из PHP-функций для работы с файловой системой – opendir(),...
7389
+1
Поиск файлов в PHP
Для поиска файлов на сервере хорошо подходит функция glob(), которая возвращает список файлов по заданной маске, например...
23387
+1
Синхронизация файлов между сайтами с помощью Rsync
Такой вопрос возникает когда у сайта есть копия, например региональный сайт или сайт на другом языке, но при этом база...
5351
+2
Работа с именами файлов в PHP
Набор PHP функций для работы с путями и именами файлов.
11456
+4
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
18083
+2
ZIP в PHP (ZipArchive)
Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.
19253
+6