Создание директории при записи файла в Node.js: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для автоматического создания каталога при записи файла в Node.js обратитесь к модулю fs.promises. Используйте функцию mkdir c опцией {recursive: true} и writeFile для сохранения файла. Пример приложения выглядит вот так:

JS
Скопировать код
const fs = require('fs').promises;

async function writeWithDir(filePath, content) {
    await fs.mkdir(require('path').dirname(filePath), { recursive: true });
    await fs.writeFile(filePath, content);
}

// Пример использования
writeWithDir('/tmp/a/apple/pie.txt', 'Вкуснотища!')
    .then(() => console.log('Яблочный пирог готов!'))
    .catch(console.error);

Данный код успешно создаёт необходимые каталоги и производит запись файла.

Кинга Идем в IT: пошаговый план для смены профессии

Осторожный синхронный подход

Для синхронного создания каталогов используйте fs.mkdirSync:

JS
Скопировать код
const fs = require('fs');
const path = require('path');

function writeWithDirSync(filePath, content) {
    const dirPath = path.dirname(filePath);
    if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath, { recursive: true });
    }
    fs.writeFileSync(filePath, content);
}

// Пример использования
writeWithDirSync('/tmp/a/banana/split.txt', 'Вкуснотища!');

Функции модуля fs позволяют удобно проверять наличие каталогов и создавать их при необходимости.

Пакеты для дополнительных возможностей

Некоторые npm-пакеты, такие как fs-extra и mkdirp, предоставляют дополнительные возможности для работы с файловой системой.

Установка fs-extra:

Bash
Скопировать код
npm install --save fs-extra

outputFile из fs-extra позволяет одновременно сохранять файл и создавать необходимый каталог:

JS
Скопировать код
const fse = require('fs-extra');

fse.outputFile('/tmp/a/strawberry.txt', 'Сладенько!', err => {
    if (err) {
        console.error(err);
    } else {
        console.log('Фруктовый салат готов!');
    }
});

Модуль fs-extra поддерживает работу с промисами, коллбэками, синхронными и асинхронными вызовами.

Создание структуры каталогов с mkpath

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

Установка mkpath:

Bash
Скопировать код
npm install mkpath

Он позволяет без труда создать структуру каталогов:

JS
Скопировать код
const mkpath = require('mkpath');
const fs = require('fs');

const directory = '/tmp/a/fruit';
mkpath(directory, function (err) {
    if (err) {
        console.error(err);
    } else {
        fs.writeFile(`${directory}/salad.txt`, 'Разные фрукты!', (err) => {
            if (err) throw err;
            console.log('Фруктовый салат ещё готов!');
        });
    }
});

Забота о безопасности асинхронных операций

Используйте async/await в сочетании с блоками try/catch для безопасных операций ввода-вывода:

JS
Скопировать код
const fs = require('fs').promises;

async function safeWrite(filePath, content) {
    try {
        await fs.mkdir(require('path').dirname(filePath), { recursive: true });
        await fs.writeFile(filePath, content, 'utf8');
    } catch (err) {
        console.error("Возникла проблема в процессе работы с файлом:", err);
    }
}

// Пример использования
safeWrite('/tmp/a/lichee.txt', 'Запись экзотической доброты');

Использование кодировки utf8 в writeFile гарантирует корректную обработку текста.

Как избежать жуткой ошибки ENOENT

Ошибка "ENOENT" информирует о некорректном пути. Эту ошибку можно предотвратить, передав { recursive: true } в mkdir или mkdirSync, тем самым гарантированно создавая невероятную структуру папок.

Визуализация

Визуализируйте процесс создания файлов и папок как волшебство леса:

Markdown
Скопировать код
🌳🏡  // Вот она, наша файловая система.

Сначала высаживается дерево — создаётся папка:

JS
Скопировать код
if (!fs.existsSync("tree")) { 
    fs.mkdirSync("tree");
}

Потом, в этом дереве строится скворечник, записывается файл:

JS
Скопировать код
fs.writeFileSync("tree/birdhouse.txt", "Твитирующий домик");

В итоге, вот что у нас получилось:

Markdown
Скопировать код
🌳
  |
  🏡  // Здесь находится скворечник, готовый принять гостей!

Полезные материалы

  1. Файловая система | Документация Node.js — Подробное описание fs API в Node.js.
  2. fs-extra – npm — Обзор fs-extra и его дополнительные функции.
  3. Javascript – Node.js Создать папку или использовать существующую – Stack Overflow — Советы по созданию каталогов в Node.js.
  4. Документация модуля path | Node.js — Описание модуля path.
  5. Модуль Util | Документация Node.js — Как преобразовать коллбэк в промис с помощью Util.promisify.
  6. Обработка ошибок | Joyent — Дополнительные способы обработки ошибок в Node.js.
  7. Использование Async Await в Express с Node 14 | от Alex Bazhenov | Medium — Практическое руководство по использованию async/await в Node.js.
Свежие материалы