Я возился с Node.js и обнаружил небольшую проблему. У меня есть сценарий, который находится в каталоге с именем data
. Я хочу, чтобы сценарий записывал некоторые данные в файл в подкаталоге внутри data
подкаталога. Однако я получаю следующую ошибку:
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
Код выглядит следующим образом:
var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
Может ли кто-нибудь помочь мне узнать, как заставить Node.js создавать структуру каталогов, если она не выходит для записи в файл?
javascript
node.js
Hirvesh
источник
источник
fs.promises.mkdir(path.dirname("tmp/test.txt"), {recursive: true}).then(x => fs.promises.writeFile("tmp/test.txt", "Hey there!"))
Ответы:
Узел> 10.12.0
fs.mkdir теперь принимает такой
{ recursive: true }
вариант:или с обещанием:
Узел <= 10.11.0
Вы можете решить эту проблему с помощью такого пакета, как mkdirp или fs-extra . Если вы не хотите устанавливать пакет, см. Ответ Тьяго Переса Франса ниже.
источник
fs.promises
это все еще экспериментальный nodejs.org/dist/latest-v10.x/docs/api/…Если вы не хотите использовать какой-либо дополнительный пакет, вы можете вызвать следующую функцию перед созданием файла:
источник
statSync
вместоexistsSync
, на основе stackoverflow.com/questions/4482686/…path
- это также пакет, который должен быть обязательным, какfs
:var path = require('path')
на случай, если кому-то интересно. См. Документацию по узлу .fs.existsSync
не является устаревшим , толькоfs.exists
есть.С node-fs-extra вы можете сделать это легко.
Установите это
Тогда воспользуйтесь
outputFile
методом. В его документации говорится:Вы можете использовать его тремя способами:
Стиль обратного звонка
Использование обещаний
Если вы используете обещания , а я на это надеюсь, вот код:
Синхронизировать версию
Если вам нужна версия для синхронизации, просто используйте этот код:
Для получения полной справки проверьте
outputFile
документацию и все методы, поддерживаемые node-fs-extra .источник
Бесстыдная пробка!
Вам нужно будет проверить каждый каталог в нужной структуре пути и создать его вручную, если он не существует. Все инструменты для этого уже есть в модуле Node fs, но вы можете сделать все это просто с помощью моего модуля mkpath: https://github.com/jrajav/mkpath
источник
Поскольку я еще не могу комментировать, я публикую расширенный ответ, основанный на фантастическом решении @ tiago-peres-frança (спасибо!). Его код не создает каталог в случае, когда в пути отсутствует только последний каталог, например, вводится «C: / test / abc», а «C: / test» уже существует. Вот фрагмент, который работает:
источник
abc
интерпретируется как файл, для которого нужно создать каталог. Чтобы также создатьabc
каталог, добавьте к своему пути фиктивный файл, напримерC:/test/abc/dummy.txt
.fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Мой совет: старайтесь не полагаться на зависимости, когда вы можете легко сделать это с помощью нескольких строк кода.
Вот чего вы пытаетесь достичь в 14 строках кода:
источник
return fs.lstatSync(dpath).isDirectory()
, иначе что произойдет, если isDirectory () вернет false?fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Я опубликовал этот модуль только потому, что мне нужен был этот функционал.
https://www.npmjs.org/package/filendir
Он работает как оболочка для методов fs в Node.js. Таким образом, вы можете использовать его точно так же, как и с
fs.writeFile
иfs.writeFileSync
(как асинхронная, так и синхронная запись)источник