Mkdir: примеры (PHP)
mkdir(string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null): boolФункция mkdir в PHP применяется для создания новой директории. Она часто используется при необходимости организовать хранение файлов, генерации временных папок или построении древовидной структуры каталогов.
Синтаксис функции выглядит следующим образом:
mkdir(string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null): bool
- directory (строка): Путь к создаваемой директории. Может быть абсолютным или относительным.
- permissions (целое число): Права доступа к директории, задаваемые в восьмеричной системе. По умолчанию 0777, что означает максимальные права. На конечные права влияет umask текущего процесса.
- recursive (логическое значение): Если установлено в true, функция создаст все вложенные директории, указанные в пути. По умолчанию false.
- context (ресурс): Контекст потока для операций с файловой системой. Используется редко, в основном при работе с удаленными файловыми системами через обертки (wrappers).
Функция возвращает true в случае успешного создания директории и false при возникновении ошибки.
$result = mkdir('new_folder');
var_dump($result);
// Результат (если директория создана успешно): bool(true)
$result = mkdir('protected_folder', 0755);
var_dump($result);
// Результат: bool(true) // Фактические права будут 0755 & ~umask
$result = mkdir('level1/level2/level3', 0777, true);
var_dump($result);
// Результат: bool(true) // Будут созданы все три вложенные директории
mkdir('existing_folder');
$result = mkdir('existing_folder');
var_dump($result);
// Результат: bool(false) // Также будет сгенерировано предупреждение (Warning)
Часто используется комбинация с функцией is_dir для предотвращения ошибок:
if (!is_dir('my_folder')) {
mkdir('my_folder');
}
Функция umask устанавливает маску прав по умолчанию для текущего процесса, что влияет на конечные права создаваемых файлов и директорий. Ее использование предпочтительнее, когда необходимо глобально изменить права для всех операций создания.
Функция rmdir выполняет противоположное действие — удаляет пустую директорию. Для рекурсивного удаления используется RecursiveDirectoryIterator или внешние команды.
Классы FilesystemIterator и DirectoryIterator предоставляют объектно-ориентированный интерфейс для работы с файловой системой, включая создание директорий через обертки.
mkdir('existing_dir'); // Успешно
$result = mkdir('existing_dir'); // Ошибка
Warning: mkdir(): File exists in ... bool(false)
// Попытка создать директорию в системном каталоге без прав суперпользователя
$result = mkdir('/usr/my_app_folder');
var_dump($result);
Warning: mkdir(): Permission denied in ... bool(false)
$result = mkdir(''); // Пустая строка
var_dump($result);
Warning: mkdir(): No such file or directory in ... bool(false)
При неправильной настройке могут возникать ошибки из-за ограничений open_basedir.
Аргумент permissions стал необязательным в явном виде, хотя и ранее имел значение по умолчанию. Это изменение скорее формальное.
Добавлена возможность указания контекста потока (context) как nullable-типа.
Был введен аргумент recursive, позволяющий создавать вложенные директории.
В PHP 8 функция стала более строгой к типам передаваемых аргументов, что предотвращает некоторые классы ошибок времени выполнения.
$basePath = 'uploads/';
$dirName = uniqid('session_', true);
$fullPath = $basePath . $dirName;
if (mkdir($fullPath, 0700, true)) {
echo "Директория создана: $fullPath";
} else {
echo "Ошибка создания директории";
}
// Результат (пример): Директория создана: uploads/session_6065f7b3a5a123.456789
$context = stream_context_create([
'ftp' => [
'overwrite' => false
]
]);
// Пример для FTP (требуется расширение FTP)
// mkdir('ftp://user:pass@example.com/newdir', 0777, false, $context);
function createDirectorySafe($path, $permissions = 0755) {
if (is_dir($path)) {
return true;
}
$parent = dirname($path);
if (!is_dir($parent)) {
createDirectorySafe($parent, $permissions);
}
return mkdir($path, $permissions);
}
$result = createDirectorySafe('deep/nested/structure/test');
var_dump($result);
bool(true)
$tempDir = sys_get_temp_dir() . '/my_app_' . getmypid();
if (!is_dir($tempDir)) {
mkdir($tempDir, 0700);
// Установка обработчика для удаления при завершении
register_shutdown_function(function() use ($tempDir) {
array_map('unlink', glob($tempDir . '/*'));
rmdir($tempDir);
});
}
echo "Рабочая директория: $tempDir";
$oldUmask = umask(0);
mkdir('strict_folder', 0755);
// Права будут точно 0755
umask($oldUmask); // Восстановление маски
Mkdir в Python
В Python для создания директорий используется функция os.mkdir (одна директория) или os.makedirs (рекурсивное создание).
import os
os.mkdir('new_folder') # Одна директория
os.makedirs('a/b/c', exist_ok=True) # Рекурсивно, exist_ok предотвращает ошибку если существует
В Node.js используется асинхронный метод fs.mkdir или его синхронная версия fs.mkdirSync с опцией recursive.
const fs = require('fs');
fs.mkdir('new_folder', { recursive: true }, (err) => {
if (err) throw err;
});
// Или синхронно:
fs.mkdirSync('new_folder', { recursive: true });
Mkdir в MySQL
В MySQL не существует прямой аналогии, так как это СУБД, а не язык для работы с файловой системой. Однако для работы с каталогами данных сервера используются системные переменные и SQL-операторы вроде CREATE TABLESPACE.
В shell-скриптах используется команда mkdir с ключом -p для рекурсивного создания.
mkdir -p /path/to/nested/directory