Набор PHP функций для работы с файлами и директориями, получение списка файлов в папке, безопасное сохранение файлов и т.д.
Получить имя файла из URL
echo basename('https://snipp.ru/donut.png');
PHP
donut.png
Имя файла без расширения
$info = pathinfo('https://snipp.ru/donut.png'); | 
		|
echo $info['filename']; | 
		
PHP
donut
Получить расширение файла
function ext($filename) | 
		|
{ | 
		|
return mb_strtolower(mb_substr(mb_strrchr($filename, '.'), 1)); | 
		|
} | 
		|
echo ext(__DIR__ . '/donut.png'); | 
		
PHP
png
Размер файла
Чтобы получить размер файла применяется функция filesize($filename), которая возвращает размер файла указанного в $filename в байтах.
echo filesize(__DIR__ . '/image.jpg');
PHP
126910
Размер директории
Функция рекурсивно проходит по всем директориям и возвращает размер всех файлов в байтах.
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
Конвертация байтов в килобайты и мегабайты
Чтобы конвертировать байты в килобайты и мегабайты можно применить следующую функцию:
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
Получить список файлов директории в виде массива
То же самое делает функция 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 | 
		|
) | 
		
Безопасное сохранение файла
Чтобы не затереть существующий файл на сервере можно применить данную функцию.
В функцию передаётся путь и имя файла, если на сервере уже существует такой файл, функция к концу файла приписывает префикс. Также если директория не существует, пытается её создать.
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
Удаление каталога со всем содержимым
function remove_dir($dir) | 
		|
{ | 
		|
if ($objs = glob($dir . '/*')) { | 
		|
foreach($objs as $obj) { | 
		|
is_dir($obj) ? remove_dir($obj) : unlink($obj); | 
		|
} | 
		|
} | 
		|
rmdir($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); | 
		|
} | 
		|
} | 
		
PHP
Удалить файлы из директории, кроме некоторых:
$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); | 
		|
} |