11

Как создать директорию, если она не существует, с помощью Node.js

12

Является ли следующий код правильным способом создания директории, если она не существует?

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

var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
    fs.mkdirSync(dir, 0744);
}

5 ответ(ов)

21

Для создания отдельных директорий в 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 }, которая позволяет создавать полную иерархию директорий, если они не существуют. Это удобное решение для создания вложенных директорий.

0

Один из решений на JavaScript:

// Или на TypeScript: import * as fs from 'fs';
const fs = require('fs');
!fs.existsSync(dir) && fs.mkdirSync(dir);

Этот код проверяет, существует ли директория dir. Если она не существует, то создаёт её.

0

Решения

  1. 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
  });
}
  1. 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 модули

0

Однострочное решение: Создает директорию, если она не существует

// Импорт
const fs = require('fs')  // В JavaScript
import * as fs from "fs"  // В TypeScript
import fs from "fs"       // В TypeScript

// Использование
!fs.existsSync(`./assets/`) && fs.mkdirSync(`./assets/`, { recursive: true })
0

Ваша реализация вполне корректна для проверки существования каталога и его создания. Однако, есть несколько важных моментов, о которых стоит упомянуть.

Во-первых, как вы правильно заметили, метод 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, что делает код более чистым и понятным. Это также может помочь в будущем, если вы захотите добавить другое поведение для обработки других типов ошибок.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь