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 data
subdirectorio. 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.promises
todaví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
statSync
lugar deexistsSync
, basado en stackoverflow.com/questions/4482686/…path
tambié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.existsSync
no está en desuso , solo lofs.exists
está.Con node-fs-extra puedes hacerlo fácilmente.
Instalarlo
Luego usa el
outputFile
mé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
outputFile
documentació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
abc
se interpreta como el archivo para el que necesita crear un directorio. Para crear también elabc
directorio, 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.writeFile
yfs.writeFileSync
(tanto asíncrona y escrituras sincrónicas)fuente