javascript node.js

javascript - Crear directorio al escribir en archivo en Node.js



(7)

Estuve 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 subdirectorio de data . Sin embargo, estoy recibiendo 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 del directorio si no sale para escribir en un archivo?


Acabo de publicar este módulo porque necesitaba esta funcionalidad.

https://www.npmjs.org/package/filendir

Funciona como un envoltorio alrededor de los métodos de Node.js fs. Entonces puede usarlo exactamente de la misma manera que lo haría con fs.writeFile y fs.writeFileSync (tanto asincrónico como síncrono)


Como todavía no puedo hacer ningún comentario, estoy publicando una respuesta mejorada basada en la fantástica solución de @ tiago-peres-frança (¡gracias!). Su código no hace el directorio en un caso en el que solo falta el último directorio en la ruta, por ejemplo, la entrada es "C: / prueba / abc" y "C: / prueba" ya existe. Aquí hay un fragmento que funciona:

function mkdirp(filepath) { var dirname = path.dirname(filepath); if (!fs.existsSync(dirname)) { mkdirp(dirname); } fs.mkdirSync(filepath); }


Con node-fs-extra puedes hacerlo.

Instalarlo

npm install --save fs-extra

Luego use el método outputFile . Su documentación dice:

Casi lo mismo que writeFile (es decir, sobrescribe), excepto que si el directorio principal no existe, se crea.

Puedes usarlo de tres maneras:

Estilo de devolución de llamada

const fse = require(''fs-extra''); fse.outputFile(''tmp/test.txt'', ''Hey there!'', err => { if(err) { console.log(err); } else { console.log(''The file was saved!''); } })

Usando Promesas

Si usa promises , y espero que sí, este es el código:

fse.outputFile(''tmp/test.txt'', ''Hey there!'') .then(() => { console.log(''The file was saved!''); }) .catch(err => { console.error(err) });

Versión de sincronización

Si quieres una versión de sincronización, solo usa este código:

fse.outputFileSync(''tmp/test.txt'', ''Hey there!'')

Para obtener una referencia completa, consulte la documentación del outputFile y todos los métodos soportados por node-fs-extra .


El estándar para la funcionalidad mkdir -p es, apropiadamente llamado, mkdirp . Las estadísticas del paquete se pueden encontrar here .


Mi consejo es: trate de no confiar en las dependencias cuando puede hacerlo fácilmente con pocas líneas de códigos

Esto es lo que intenta lograr en 14 líneas de código:

fs.isDir = function(dpath) { try { return fs.lstatSync(dpath).isDirectory(); } catch(e) { return false; } }; fs.mkdirp = function(dirname) { dirname = path.normalize(dirname).split(path.sep); dirname.forEach((sdir,index)=>{ var pathInQuestion = dirname.slice(0,index+1).join(path.sep); if((!fs.isDir(pathInQuestion)) && pathInQuestion) fs.mkdirSync(pathInQuestion); }); };


Shameless plug alerta!

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 puedes hacer todo eso simplemente con mi módulo mkpath: https://github.com/jrajav/mkpath


Si no desea utilizar ningún paquete adicional, puede llamar a la siguiente función antes de crear su archivo:

var path = require(''path''), fs = require(''fs''); function ensureDirectoryExistence(filePath) { var dirname = path.dirname(filePath); if (fs.existsSync(dirname)) { return true; } ensureDirectoryExistence(dirname); fs.mkdirSync(dirname); }