He estado jugando con Node.js y encontré un pequeño problema. Tengo un script que reside en un directorio llamado data. Quiero que el script escriba algunos datos en un archivo en un subdirectorio dentro del datasubdirectorio. Sin embargo, recibo el siguiente error:
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
El código es el siguiente:
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!");
}
});
¿Alguien puede ayudarme a descubrir cómo hacer que Node.js cree la estructura de directorios si no sale para escribir en un archivo?
javascript
node.js
Hirvesh
fuente
fuente

fs.promises.mkdir(path.dirname("tmp/test.txt"), {recursive: true}).then(x => fs.promises.writeFile("tmp/test.txt", "Hey there!"))Respuestas:
Nodo> 10.12.0
fs.mkdir ahora acepta una
{ recursive: true }opción como esta:o con una promesa:
Nodo <= 10.11.0
Puede resolver esto con un paquete como mkdirp o fs-extra . Si no desea instalar un paquete, consulte la respuesta de Tiago Peres França a continuación.
fuente
fs.promisestodavía es experimental nodejs.org/dist/latest-v10.x/docs/api/…Si no desea utilizar ningún paquete adicional, puede llamar a la siguiente función antes de crear su archivo:
fuente
statSynclugar deexistsSync, basado en stackoverflow.com/questions/4482686/…pathtambién es un paquete que debe ser requerido comofs:var path = require('path')en caso de que alguien se pregunte. Ver documentación del nodo .fs.existsSyncno está en desuso , solo lofs.existsestá.Con node-fs-extra puedes hacerlo fácilmente.
Instalarlo
Luego usa el
outputFilemétodo. Su documentación dice:Puedes usarlo de tres maneras:
Estilo de devolución de llamada
Usando promesas
Si usa promesas , y eso espero, este es el código:
Versión de sincronización
Si quieres una versión de sincronización, solo usa este código:
Para obtener una referencia completa, consulte la
outputFiledocumentación y todos los métodos soportados por node-fs-extra .fuente
¡Alerta de enchufe descarado!
Deberá verificar cada directorio en la estructura de ruta que desee y crearlo manualmente si no existe. Todas las herramientas para hacerlo ya están allí en el módulo fs de Node, pero puede hacer todo eso simplemente con mi módulo mkpath: https://github.com/jrajav/mkpath
fuente
Como todavía no puedo comentar, estoy publicando una respuesta mejorada basada en la fantástica solución @ tiago-peres-frança (¡gracias!). Su código no crea un directorio en un caso en el que solo falta el último directorio en la ruta, por ejemplo, la entrada es "C: / test / abc" y "C: / test" ya existe. Aquí hay un fragmento que funciona:
fuente
abcse interpreta como el archivo para el que necesita crear un directorio. Para crear también elabcdirectorio, agregue un archivo ficticio a su ruta, por ejemploC:/test/abc/dummy.txt.fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))Mi consejo es: trate de no depender de las dependencias cuando pueda hacerlo fácilmente con pocas líneas de códigos
Esto es lo que está tratando de lograr en 14 líneas de código:
fuente
return fs.lstatSync(dpath).isDirectory(), de lo contrario, ¿qué pasaría si isDirectory () devuelve falso?fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))Acabo de publicar este módulo porque necesitaba esta funcionalidad.
https://www.npmjs.org/package/filendir
Funciona como un contenedor alrededor de los métodos Node.js fs. Así que se puede usar de la misma manera que lo haría con
fs.writeFileyfs.writeFileSync(tanto asíncrona y escrituras sincrónicas)fuente