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 EEXIST
la 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!e
falla, entonces sabes quee
es 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
err
se 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'sfs
ahora 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
EPERM
oEACCESS
, 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).EEXIST
Sin embargo, si el error no es así , debemos arrojar un error, porque podríamos estar tratando con algo como unEPERM
oEACCES
Por
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/c
fuente
Si desea un revestimiento rápido y sucio, use esto:
fuente
fs.exists
está en desuso: nodejs.org/api/fs.html#fs_fs_exists_path_callbackLos documentos de node.js
fs.mkdir
básicamente difieren de la página de manual de Linux paramkdir(2)
. Eso indica queEEXIST
tambié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.stat
que 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
fs
mé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
stat
antesmkdir
tiene el potencial de una condición de carrera, tenga esto en cuenta.Puedes usar esto:
fuente
statSync
arrojará un error si la entidad no existe en absoluto, bloqueando el código. Necesita envolver esto en untry/catch
bloque.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. (regresaundefined
si 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:
createDirectory
funció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/test
enC:\directory\test
(cuando esté en Windows)fs.exists
está en desuso , es por eso que usofs.stat
para verificar si el directorio ya existeENOENT
( E rror NO ENT ry)fs.mkdir
fs.mkdir
sobre su contraparte de bloqueofs.mkdirSync
y, 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)
stat
ymkdir
y (2)mkdir
y 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
ensureDir
método delfs-extra
paquete.No solo se puede usar como un reemplazo descarado para el
fs
módulo integrado , sino que también tiene muchas otras funcionalidades además de las funcionalidades delfs
paquete.El
ensureDir
mé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
async
versión del mismo. También tiene un método sincrónico para realizar esto en la forma delensureDirSync
mé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