Necesito escribir el archivo en la siguiente ruta:
fs.writeFile('/folder1/folder2/file.txt', 'content', function () {…});
Pero el '/folder1/folder2'
camino puede no existir. Entonces obtengo el siguiente error:
mensaje = ENOENT, abra /folder1/folder2/file.txt
¿Cómo puedo escribir contenido en esa ruta?
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))
Respuestas:
Utilice mkdirp en combinación con
path.dirname
first.Si todo el camino ya existe,
mkdirp
es un error. De lo contrario, crea todos los directorios que faltan.Este módulo hace lo que quiere: https://npmjs.org/package/writefile . Lo entendí al buscar en Google "writefile mkdirp". Este módulo devuelve una promesa en lugar de recibir una devolución de llamada, así que asegúrese de leer primero una introducción a las promesas. De hecho, podría complicarte las cosas.
La función que le di funciona en cualquier caso.
fuente
fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Encuentro que la forma más fácil de hacer esto es usar el método outputFile () del módulo fs-extra .
Ejemplo:
¡También tiene soporte prometedor listo para usar en estos días!
fuente
Quizás lo más simple es que puede usar el módulo npm fs-path .
Su código se vería así:
fuente
Editar
La versión de NodeJS
10.12.0
ha agregado un soporte nativo para ambosmkdir
ymkdirSync
para crear el director principal de forma recursiva conrecursive: true
la siguiente opción:Y si lo prefieres
fs Promises API
puedes escribirRespuesta original
¡Cree los directorios principales de forma recursiva si no existen! ( Cero dependencias )
Uso
Manifestación
¡Intentalo!
Explicaciones
EISDIR
para Mac yEPERM
yEACCES
para Windows.{isRelativeToScript: true}
.path.sep
ypath.resolve()
, no solo/
concatenación, para evitar problemas multiplataforma.fs.mkdirSync
y manejo del error contry/catch
si se tiran para manejar las condiciones de carrera: otro proceso puede agregar el archivo entre las llamadas afs.existsSync()
yfs.mkdirSync()
y provoca una excepción.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. Pero este es un anti-patrón que deja al código vulnerable a las condiciones de carrera.fuente
Puedes usar
stats
es unfs.Stats
tipo de objeto, puedes comprobarlostats.isDirectory()
. Dependiendo del examen deerr
ystats
puedes hacer algo,fs.mkdir( ... )
o arrojar un error.Referencia
Actualización: se corrigieron las comas en el código.
fuente
Aquí está mi función personalizada para crear directorios de forma recursiva (sin dependencias externas):
fuente
Aquí está mi función que funciona en el nodo 10.12.0. Espero que esto ayude.
fuente
Con node-fs-extra puedes hacerlo fácilmente.
Instalarlo
A continuación, utilice la OutputFile método en lugar de writeFileSync
fuente
Aquí hay parte de la respuesta de Myrne Stol desglosada como una respuesta separada:
fuente
fuente