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

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

1

Получить имя файла из URL

echo basename('https://snipp.ru/donut.png');
PHP
donut.png
2

Имя файла без расширения

$info = pathinfo('https://snipp.ru/donut.png');
echo $info['filename'];
PHP
donut
3

Получить расширение файла

function ext($filename)
{
	return mb_strtolower(mb_substr(mb_strrchr($filename, '.'), 1));
}

echo ext(__DIR__ . '/donut.png');
PHP
png
4

Размер файла

Чтобы получить размер файла применяется функция filesize($filename), которая возвращает размер файла указанного в $filename в байтах.

echo filesize(__DIR__ . '/image.jpg');
PHP
126910
5

Размер директории

Функция рекурсивно проходит по всем директориям и возвращает размер всех файлов в байтах.

function dir_size($path) {
	$path = rtrim($path, '/');
	$size = 0;
	$dir = opendir($path);
	if (!$dir) {
		return 0;
	}
	
	while (false !== ($file = readdir($dir))) {
		if ($file == '.' || $file == '..') {
			continue;
		} elseif (is_dir($path . $file)) {
			$size += dir_size($path . DIRECTORY_SEPARATOR . $file);
		} else {
			$size += filesize($path . DIRECTORY_SEPARATOR . $file);
		}
	}
	closedir($dir);
	return $size;
}

echo dir_size(__DIR__);
PHP
6

Конвертация байтов в килобайты и мегабайты

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

function convert_bytes($size)
{
	$i = 0;
	while (floor($size / 1024) > 0) {
		++$i;
		$size /= 1024;
	}

	$size = str_replace('.', ',', round($size, 1));
	switch ($i) {
		case 0: return $size .= ' байт';
		case 1: return $size .= ' КБ';
		case 2: return $size .= ' МБ';
	}
}

echo convert_bytes(filesize(__DIR__ . '/image.jpg')); // Выведет: 123,9 КБ
PHP
7

Получить список файлов директории в виде массива

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

Безопасное сохранение файла

Чтобы не затереть существующий файл на сервере можно применить данную функцию.

В функцию передаётся путь и имя файла, если на сервере уже существует такой файл, функция к концу файла приписывает префикс. Также если директория не существует, пытается её создать.

function safe_file($filename)
{
	$dir = dirname($filename);
	if (!is_dir($dir)) {
		mkdir($dir, 0777, true);
	}

	$info = pathinfo($filename);
	$name = $dir . '/' . $info['filename']; 
	$prefix = '';
	$ext = (empty($info['extension'])) ? '' : '.' . $info['extension'];

	if (is_file($name . $ext)) {
		$i = 1;
		$prefix = '_' . $i;
		while (is_file($name . $prefix . $ext)) {
			$prefix = '_' . ++$i;
		}
	}

	return $name . $prefix . $ext;
}  

// Если в директории есть файл log.txt, файл будет сохранен с названием log_1.txt
file_put_contents(safe_file(__DIR__ . '/log.txt'), $text);
PHP
9

Удаление каталога со всем содержимым

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

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

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);
	}
}
PHP
11

Копирование директории с ее содержимым

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, обновлено 19.09.2019 4225

Поделится

Темы

Files PHP

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

Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
PHP функции для перевода текста, ЧПУ, ссылок и имен файлов в транслит.
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
Ниже приведён список MIME-заголовков и расширений файлов. В PHP скриптах, перед отправкой файлов в браузер,...