Ya he leído la documentación de Node.js y, a menos que me haya perdido algo, no dice qué contienen los parámetros en ciertas operaciones, en particular fs.mkdir(). Como puede ver en la documentación, no es mucho.
Actualmente, tengo este código, que intenta crear una carpeta o usar una existente en su lugar:
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
Pero me pregunto si esta es la forma correcta de hacerlo. ¿Verificando el código es EEXISTla forma correcta de saber que la carpeta ya existe? Sé que puedo hacer fs.stat()antes de hacer el directorio, pero eso ya serían dos visitas al sistema de archivos.
En segundo lugar, ¿hay una documentación completa o al menos más detallada de Node.js que contenga detalles sobre qué contienen los objetos de error, qué parámetros significan, etc.
javascript
node.js
Joseph
fuente
fuente

e &&. Si!efalla, entonces sabes queees verdad.Respuestas:
Una buena forma de hacerlo es usar el módulo mkdirp .
Úselo para ejecutar la función que requiere el directorio. La devolución de llamada se llama después de crear la ruta o si la ruta ya existía. El error
errse establece si mkdirp no pudo crear la ruta del directorio.fuente
fs.exists(Sync).Editar: debido a que esta respuesta es muy popular, la actualicé para reflejar las prácticas actualizadas.
Nodo> = 10
La nueva
{ recursive: true }opción de Node'sfsahora permite esto de forma nativa. Esta opción imita el comportamiento de UNIXmkdir -p. Se asegurará recursivamente de que exista cada parte de la ruta y no arrojará un error si alguno de ellos lo hace.(Nota: aún podría arrojar errores como
EPERMoEACCESS, por lo que es mejor envolverlo en untry {} catch (e) {}si su implementación es susceptible a ello).Versión sincrónica.
Versión asíncrona
Versiones de nodos anteriores
Usando a
try {} catch (err) {}, puedes lograr esto con mucha gracia sin encontrar una condición de carrera.Para evitar el tiempo muerto entre verificar la existencia y crear el directorio, simplemente tratamos de crearlo directamente, y no tenemos en cuenta el error si es
EEXIST(el directorio ya existe).EEXISTSin embargo, si el error no es así , debemos arrojar un error, porque podríamos estar tratando con algo como unEPERMoEACCESPor
mkdir -p-como el comportamiento recursivo, por ejemplo./a/b/c, habría que llamarlo en cada parte de la dirpath, por ejemplo./a,./a/b,.a/b/cfuente
Si desea un revestimiento rápido y sucio, use esto:
fuente
fs.existsestá en desuso: nodejs.org/api/fs.html#fs_fs_exists_path_callbackLos documentos de node.js
fs.mkdirbásicamente difieren de la página de manual de Linux paramkdir(2). Eso indica queEEXISTtambién se indicará si la ruta existe pero no es un directorio que crea un caso de esquina incómodo si sigue esta ruta.Es mejor que llames
fs.statque que le dirá si la ruta existe y si es un directorio en una sola llamada. Para (lo que supongo es) el caso normal donde el directorio ya existe, es solo un hit del sistema de archivos.Estos
fsmétodos de módulo son envoltorios delgados alrededor de las API nativas de C, por lo que debe verificar las páginas de manual a las que se hace referencia en los documentos de node.js para obtener detalles.fuente
statantesmkdirtiene el potencial de una condición de carrera, tenga esto en cuenta.Puedes usar esto:
fuente
statSyncarrojará un error si la entidad no existe en absoluto, bloqueando el código. Necesita envolver esto en untry/catchbloque.fs.existsSync()yfs.exists()quedará en desuso.Propongo una solución sin módulos (nunca se recomienda acumular módulos para su mantenimiento, especialmente para funciones pequeñas que se pueden escribir en unas pocas líneas ...):
ÚLTIMA ACTUALIZACIÓN :
En v10.12.0, NodeJS implementa opciones recursivas:
ACTUALIZACIÓN
fuente
fs.exists()está en desuso en el nodo v9. utilizarfs.access()en su lugar. (regresaundefinedsi el archivo existe; de lo contrario arroja un errorENOENT)fs.mkdirSync('my/new/folder/create', {recursive: true})?También puedes usar fs-extra , que proporciona muchas operaciones de archivos de uso frecuente.
Código de muestra:
documentos aquí: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback
fuente
Aquí está el código ES6 que uso para crear un directorio (cuando no existe):
Nota:
createDirectoryfunción, normalizo la ruta para garantizar que el tipo de separador de ruta del sistema operativo se utilizará de forma coherente (por ejemplo, esto se convertiráC:\directory/testenC:\directory\test(cuando esté en Windows)fs.existsestá en desuso , es por eso que usofs.statpara verificar si el directorio ya existeENOENT( E rror NO ENT ry)fs.mkdirfs.mkdirsobre su contraparte de bloqueofs.mkdirSyncy, debido al ajustePromise, se garantizará que la ruta del directorio solo se devolverá después de que el directorio se haya creado correctamentefuente
En mi opinión, es mejor que no cuentes los hits del sistema de archivos mientras codificas en Javascript. Sin embargo, (1)
statymkdiry (2)mkdiry el cheque (o descarte) el código de error, ambas formas son formas adecuadas para hacer lo que quiere.fuente
fuente
Puede hacer todo esto con el módulo Sistema de archivos.
Realmente ni siquiera necesita verificar si el directorio existe. El siguiente código también garantiza que el directorio ya existe o está creado.
fuente
La respuesta de Raugaral pero con la funcionalidad -p. Feo, pero funciona:
fuente
Como una nueva alternativa a la respuesta de Teemu Ikonen , que es muy simple y fácil de leer, es usar el
ensureDirmétodo delfs-extrapaquete.No solo se puede usar como un reemplazo descarado para el
fsmódulo integrado , sino que también tiene muchas otras funcionalidades además de las funcionalidades delfspaquete.El
ensureDirmétodo, como su nombre indica, asegura que el directorio exista. Si la estructura del directorio no existe, se crea. Al igualmkdir -p. No solo la carpeta final, sino que se crea la ruta completa si aún no existe.el que se proporciona arriba es la
asyncversión del mismo. También tiene un método sincrónico para realizar esto en la forma delensureDirSyncmétodo.fuente
La respuesta de @ Liberateur anterior no funcionó para mí (Nodo v8.10.0). Una pequeña modificación hizo el truco, pero no estoy seguro de si esta es una forma correcta. Por favor recomiende.
fuente