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 .
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);
}