node existe comprobar archivo node.js

node.js - node - comprobar si existe archivo javascript



fs.exists, fs.existsSync: ¿por qué están en desuso? (7)

Estaba buscando una solución a este problema y descubrí que fs.exists y fs.existsSync estaban en desuso. Esto parece funcionar bien en mi senario.

fs.readFile(filename, ''utf8'', function(err,data){ // the err variable substitutes for the fs.exists callback function variable if (!err){ // do what you planned with the file console.log(data) }else{ // handle the non-existence of the file console.log(''File does not exist!''); } });

Noté que la documentación oficial del nodo dice algo sorprendente acerca de fs.exists :

"fs.exists () es un anacronismo y existe solo por razones históricas. Casi nunca debe haber una razón para usarlo en su propio código.

En particular, verificar si existe un archivo antes de abrirlo es un antipatrón que lo deja vulnerable a las condiciones de carrera: otro proceso puede eliminar el archivo entre las llamadas a fs.exists () y fs.open (). Simplemente abra el archivo y maneje el error cuando no esté allí ".

Entiendo la sugerencia, abrir un archivo y luego manejar el error si no existe, pero lo que no entiendo es por qué la interfaz está en desuso en lugar de la implementación simplemente cambiando.

¿Alguien puede explicarme por qué comprobar que la existencia de un archivo con una API tan simple y lógica como fs.exists es algo tan malo que debería llamarse antipatrón y eliminarse de la API del nodo?


Estar en desuso porque es un anti-patrón según algunos. Es decir, no es seguro confiar que exista () y luego hacer algo con el archivo porque el archivo puede eliminarse entre la llamada de existencia y la llamada de hacer algo.

Estoy de acuerdo en el caso anterior. Pero para mí, hay más uso de existir (). Coloco archivos vacíos en mis directorios temporales y de caché. Cuando realizo operaciones peligrosas , como eliminar archivos antiguos del directorio de caché, busco mi archivo ficticio para asegurarme de que no estoy operando en el directorio incorrecto. Es decir, solo necesito confirmar que el archivo está ahí. Existe la opción perfecta para esto, pero creo que cambiaré a usar stat () en su lugar.


La implementación de existirSync es así (v0.10.25):

function (path) { try { nullCheck(path); binding.stat(pathModule._makeLong(path)); return true; } catch (e) { return false; } }

así que si escribe un programa como if(fs.existsSync(thepath)){} , es mejor cambiarlo a if(fs.statSync(thepath)){} .


Lo pienso porque es redundante. Puedes verificar si existe un archivo intentando abrirlo. Te dará ENOENT si no existe:

> fs.open(''foo'', ''r'', function(err, fd) { ... console.log(err, fd); ... }) undefined > { [Error: ENOENT, open ''foo''] errno: 34, code: ''ENOENT'', path: ''foo'' } undefined


No es necesario utilizar fs.stat (), porque fs.existsSync () no ha quedado en desuso.

https://nodejs.org/api/fs.html#fs_fs_existssync_path

fs.existsSync (ruta)

Añadido en: v0.1.21 ruta | Versión síncrona de fs.exists (). Devuelve verdadero si el archivo existe, falso de lo contrario.

Tenga en cuenta que fs.exists () está en desuso, pero fs.existsSync () no está en desuso . (El parámetro callback> a fs.exists () acepta parámetros que son inconsistentes con otras devoluciones de llamada> Node.js. Fs.existsSync () no usa una devolución de llamada.)


Por el segundo párrafo que citaste.

No tiene sentido verificar si existe un archivo, ya que siempre se puede eliminar justo después de la verificación.