PHP

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

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

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

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

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

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

echo ext(__DIR__ . '/donut.png');
png
3

Размер файла

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

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

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

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

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__);
5

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

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

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 КБ
6

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

То же самое делает функция scandir(), разница в том что у 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__));
Array
(
    [0] => favicon.ico
    [1] => index.php
    [2] => image.jpg
    [3] => robots.txt
)
7

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

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

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

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);
8

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

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

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

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);
    }
}
10

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

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);
}
07 ноября 2016
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают или совсем не...
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать...