199 votos

Nodo.JS crear carpeta o usar la existente

Ya he leído la documentación de Node.JS y, a menos que se me haya pasado algo por alto, 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 es la forma correcta de hacerlo. Es comprobar el código 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ía dos golpes 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é objetos de error contienen, qué parámetros significan, etc.?

239voto

Teemu Ikonen Puntos 3013

Una buena manera de hacer esto es usar mkdirp módulo.

$ npm install mkdirp

Entonces úsalo para ejecutar la función que requiere el directorio. La llamada de retorno se llama después de que se crea el directorio (si no existe ya). El error se establece si mkdirp no pudo crear la ruta del directorio.

var mkdirp = require('mkdirp');
mkdirp('/tmp/some/path/foo', function(err) { 

    // path was created unless there was error

});

216voto

Christophe Marois Puntos 705

Usando un try {} catch {} puedes lograr esto con mucha gracia sin encontrar una condición de raza:

Fs.mkdirSync(path) tolerante a las fallas

var mkdirSync = function (path) {
  try {
    fs.mkdirSync(path);
  } catch(e) {
    if ( e.code != 'EEXIST' ) throw e;
  }
}

Explicación

En ambas versiones de la función, Nodo intentará crear el directorio y lanzará una excepción si encuentra una excepción al hacerlo. En el catch {} Sin embargo, continuamos la ejecución de la cláusula script como si nada hubiera pasado si el código de error es EEXIST lo que significa que el directorio existe. Si el código de error no es EEXIST sin embargo, debemos arrojar un error, porque probablemente estamos tratando con una excepción de sistema de archivos como EACCES (permiso denegado).

Ejemplos

Vamos a crear los directorios ./first/second/third y ./first/second/fourth dado:

var fs    = require('fs')
  , path  = require('path');

var mkdirSync = function (path) {
  try {
    fs.mkdirSync(path);
  } catch(e) {
    if ( e.code != 'EEXIST' ) throw e;
  }
}

Método 1: Lineal

mkdirSync( path.join('first') );
mkdirSync( path.join('first', 'second') );
mkdirSync( path.join('first', 'second', 'third') );
mkdirSync( path.join('first', 'second') ); // Just to demonstrate fault tolerance
mkdirSync( path.join('first', 'second', 'fourth') );

Método 2: mkdir -p -como la recursividad

var mkdirpSync = function (dirpath) {
  var parts = dirpath.split(path.sep);
  for( var i = 1; i <= parts.length; i++ ) {
    fs.mkdirSync( path.join.apply(null, parts.slice(0, i)) );
  }
}

mkdirpSync('first/second/third');
mkdirpSync('first/second/fourth');

27voto

JohnnyHK Puntos 61191

El nodo. JS docs para fs.mkdir Básicamente se remite a la página de manual de Linux para mkdir(2) . Eso indica que EEXIST también se indicará si el camino existe pero no es un directorio que crea un caso de esquina incómoda si vas por esta ruta.

Puede que sea mejor que llames fs.stat que le dirá si la ruta existe y si es un directorio en una sola llamada. Para (lo que asumo es) el caso normal donde el directorio ya existe, es sólo un golpe de sistema de archivos.

Estos fs Los métodos de módulos son delgados envoltorios alrededor de las APIs nativas de C, así que tienes que revisar las páginas de manual referenciadas en el nodo.JS docs para los detalles.

25voto

Raugaral Puntos 111

Puedes usar esto:

 if(!fs.existsSync("directory")){
     fs.mkdirSync("directory", 0766, function(err){
       if(err){ 
         console.log(err);
         response.send("ERROR! Can't make the directory! \n");    // echo the result back
       }
     });   
 }

3voto

cwyang Puntos 341

Mejor que no cuentes los golpes del sistema de archivos mientras codificas en Javascript, en mi opinión. Sin embargo, (1) stat & mkdir y (2) mkdir y comprobar (o descartar) el código de error, ambas formas son las correctas para hacer lo que quieras.

Gracias.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X