saber si existe un archivo para no sobre escribirlo

publicado por: Anonymous

debo utilizar esta funcion ?

fs.exists(path, callback)

no se como hacer la funcion para saber si ya existe el archivo con el mismo nombre, y si no entonces crearlo

mi funcion es:

function escribir(archivo,data){
fs.stat('./archivos/'+archivo+'.txt', function(err, stat) {
if(err == null) {
    console.log('File exists');
} else if(err.code == 'ENOENT') {

    fs.writeFile('./archivos/'+archivo+'.txt', data, function(err) {
    if( err ){
        console.log( err );
    }
    else{
        console.log('Se ha escrito correctamente');
    }
    });
} else {
    console.log('Some other error: ', err.code);
}

});
}

solución

Tienes algunas opciones, veamos algunas.

Síncrono

Si prefieres la manera síncrona, hay un par de métodos en la API que puedes usar.

fs#accessSync

Este método comprueba si un archivo es accesible. Si no lo es, es decir, si no existe, lanzará una excepción.

try {
  if(fs.accessSync('/archivo.dat')) {
    // existe
  }
} catch (e) {
  // no existe
}

Puedes crear una wrapper para esto:

function fileExists(path) {
  try {
    if(fs.accessSync('/archivo.dat')) {
      return true;
    }
  } catch (e) {
    return false;
  }
}

fs#statSync

La solución anterior es válida, pero, ¿qué pasaría si hay un directorio y un archivo con el mismo nombre? Lo que pasaría es que no lanzaría ninguna excepción y si olvidamos esto, nos puede causar un dolor de cabeza al depurar.

La solución más viable sería statSync. Esta función te permite saber si e archivo encontrado es un directorio o un archivo.

function fileExists(path) {
  try {
    return fs.statSync(path).isFile();
  } catch (e) {
    return false;
  }
}

Ten en cuenta que pueden haber errores al tratar de ver la disponibilidad de un archivo/directorio; en este caso sería mejor devolver false solo si el código de error es ENOENT (error no entry): if(e.code === 'ENOENT') y relanzar el error o manejarlo si ocurrió otro error, como por ejemplo por permisos.

Si lo quisiésemos adaptar para saber si es un directorio solo tendremos que cambiar isFile por isDirectory.

Asíncrono

El modo asíncrono de las funciones es muy parecido, la diferencia es que reciben un callback.

function fileExists(file, cb) {
  fs.stat(file, (err, stats) => {
    if (err) {
      if (err.code === 'ENOENT') {
        return cb(null, false);
      } else { // en caso de otro error
        return cb(err);
      }
    }
    // devolvemos el resultado de `isFile`.
    return cb(null, stats.isFile());
  });
}

Y se usaría de la siguiente manera:

fileExists('/archivo.dat', (err, exists) => {
  if(err) {
    // manejar otro tipo de error
  }
  if(exists) {
    // hacer algo si existe
  } else {
    // hacer algo si no existe
  }
});

O si prefieres las promesas, puedes usar el módulo es6-promise:

function existsFile(path) {
  return new Promise((resolve, reject) => {
    fs.stat(file, (err, stats) => {
        if (err) {
          if (err.code === 'ENOENT') {
           resolve(false);
          } else { // en caso de otro error
            reject(err);
          }
        }
        // devolvemos el resultado de `isFile`.
        resolve(stats.isFile());
      });
  });
}

Lo usaríamos de la siguiente manera:

existsFile('/archivo.dat')
  .then(exists => {
    if(exists) {

    } else {

    }
  })
  .catch(err => {
    // manejar error
  });
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *