Набор 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); |
|
} |