Создание директории при записи файла в Node.js: решение
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для автоматического создания каталога при записи файла в Node.js обратитесь к модулю fs.promises
. Используйте функцию mkdir
c опцией {recursive: true}
и writeFile
для сохранения файла. Пример приложения выглядит вот так:
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);
Данный код успешно создаёт необходимые каталоги и производит запись файла.
Осторожный синхронный подход
Для синхронного создания каталогов используйте fs.mkdirSync
:
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:
npm install --save fs-extra
outputFile
из fs-extra
позволяет одновременно сохранять файл и создавать необходимый каталог:
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:
npm install mkpath
Он позволяет без труда создать структуру каталогов:
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
для безопасных операций ввода-вывода:
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
, тем самым гарантированно создавая невероятную структуру папок.
Визуализация
Визуализируйте процесс создания файлов и папок как волшебство леса:
🌳🏡 // Вот она, наша файловая система.
Сначала высаживается дерево — создаётся папка:
if (!fs.existsSync("tree")) {
fs.mkdirSync("tree");
}
Потом, в этом дереве строится скворечник, записывается файл:
fs.writeFileSync("tree/birdhouse.txt", "Твитирующий домик");
В итоге, вот что у нас получилось:
🌳
|
🏡 // Здесь находится скворечник, готовый принять гостей!
Полезные материалы
- Файловая система | Документация Node.js — Подробное описание fs API в Node.js.
- fs-extra – npm — Обзор
fs-extra
и его дополнительные функции. - Javascript – Node.js Создать папку или использовать существующую – Stack Overflow — Советы по созданию каталогов в Node.js.
- Документация модуля path | Node.js — Описание модуля
path
. - Модуль Util | Документация Node.js — Как преобразовать коллбэк в промис с помощью
Util.promisify
. - Обработка ошибок | Joyent — Дополнительные способы обработки ошибок в Node.js.
- Использование Async Await в Express с Node 14 | от Alex Bazhenov | Medium — Практическое руководство по использованию
async/await
в Node.js.