Как создать директорию, если она не существует, с помощью Node.js
Является ли следующий код правильным способом создания директории, если она не существует?
Необходимо, чтобы у скрипта были полные права доступа, а для других пользователей директория была читабельна.
var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
fs.mkdirSync(dir, 0744);
}
5 ответ(ов)
Для создания отдельных директорий в Node.js вы можете использовать следующий код:
var fs = require('fs');
var dir = './tmp';
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
Этот код проверяет, существует ли директория ./tmp
, и если нет, то создаёт её.
Если вам нужно создать вложенные директории, вы можете воспользоваться следующим кодом:
var fs = require('fs');
var dir = './tmp/but/then/nested';
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
Здесь мы используем опцию { recursive: true }
, которая позволяет создавать полную иерархию директорий, если они не существуют. Это удобное решение для создания вложенных директорий.
Один из решений на JavaScript:
// Или на TypeScript: import * as fs from 'fs';
const fs = require('fs');
!fs.existsSync(dir) && fs.mkdirSync(dir);
Этот код проверяет, существует ли директория dir
. Если она не существует, то создаёт её.
Решения
CommonJS
const fs = require('fs');
const path = require('path');
const dir = path.resolve(path.join(__dirname, 'upload'));
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
// ИЛИ
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, {
mode: 0o744, // Не поддерживается на Windows. По умолчанию: 0o777
});
}
ESM
Обновите конфигурацию вашего файла
package.json
{
// укажите использование ECMAScript модулей (ESM)
"type": "module",
//...
}
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
// Создайте свою собственную `__dirname`, так как она не существует в окружении es-module.
// Используйте `import.meta.url`, чтобы получить URL текущего модуля,
// затем получите абсолютный путь к папке модуля
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const dir = path.resolve(path.join(__dirname, 'upload'));
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
// ИЛИ
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, {
mode: 0o744, // Не поддерживается на Windows. По умолчанию: 0o777
});
}
Обновление 2022 года
import { existsSync } from 'node:fs';
Ссылки
Версия NodeJS: v18.2.0
ESM: ECMAScript модули
Однострочное решение: Создает директорию, если она не существует
// Импорт
const fs = require('fs') // В JavaScript
import * as fs from "fs" // В TypeScript
import fs from "fs" // В TypeScript
// Использование
!fs.existsSync(`./assets/`) && fs.mkdirSync(`./assets/`, { recursive: true })
Ваша реализация вполне корректна для проверки существования каталога и его создания. Однако, есть несколько важных моментов, о которых стоит упомянуть.
Во-первых, как вы правильно заметили, метод fs.exists()
помечен как устаревший. Использование fs.stat()
— это хороший способ проверить существование файла или директории.
Ваш код проверяет наличие директории и обрабатывает ошибку в случае ее отсутствия. Если возникает ошибка с сообщением 'no such file or directory', вы создаете директорию с помощью fs.mkdir()
. Это работает, но стоит отметить, что использование catch
для обработки ошибки может затруднить дальнейшую обработку исключений.
Вот немного улучшенная версия кода, которая использует async/await
для повышения читаемости и управления ошибками:
const fs = require('fs').promises;
const dir = './dir';
async function ensureDirectoryExists(directory) {
try {
await fs.stat(directory);
} catch (err) {
if (err.code === 'ENOENT') { // ENOENT - ошибка, связанная с отсутствием файла или директории
await fs.mkdir(directory);
console.log(`Директория ${directory} успешно создана.`);
} else {
// Обработка других ошибок
console.error(`Ошибка при проверке директории: ${err.message}`);
}
}
}
ensureDirectoryExists(dir);
В этой версии мы используем try/catch
для более точного управления ошибками и проверки кода ошибки ENOENT
, что делает код более чистым и понятным. Это также может помочь в будущем, если вы захотите добавить другое поведение для обработки других типов ошибок.
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Как исправить ошибку "ReferenceError: primordials is not defined" в Node.js
Как протестировать один файл с помощью Jest?
nvm постоянно "забывает" Node.js в новой сессии терминала
Лучшие практики обработки исключений в Node.js