2011-12-20 11 views
8

Estoy intentando escribir una función que me dice que una determinada ruta es un directorio.Tengo problemas para entender cómo funciona fs.stat()

var fs = require('fs'); 
console.log("+++++++++++++++++++++++++++++++++++++++"); 
fs.statSync(pathname, function(err, stats) { 
    console.log(stats.isDirectory()); 
}); 
console.log("+++++++++++++++++++++++++++++++++++++++"); 

Sin embargo, nunca imprime la respuesta.

Si existe el nombre de ruta, no llama a la función. Si no existe, genera una excepción: ENOENT not a file or directory. No quiero saber si existe el nombre de ruta, pero quiero saber si es un directorio.

¿Alguien me puede ayudar a arreglarlo?

Respuesta

24

Está utilizando la versión síncrona, que no utiliza una devolución de llamada. Simplemente devuelve el resultado en su lugar. Así que, o utilizar la forma asincrónica fs.stat(path, callback) o utilice el formulario de sincronización de la siguiente manera:

var fs = require('fs'); 
console.log("+++++++++++++++++++++++++++++++++++++++"); 
var stats = fs.statSync(pathname); 
console.log(stats.isDirectory()); 
console.log("+++++++++++++++++++++++++++++++++++++++"); 
+0

excelente, ¡gracias! –

1

Cómo fs.stat() funciona?

Si desea utilizar una función de devolución de llamada fs/asíncrono, no utilice la versión sincrónica, utilice fs.stat():

var fs = require('fs'); 
console.log("+++++++++++++++++++++++++++++++++++++++"); 
fs.stat(pathname, function(err, stats) { 
    console.log(stats.isDirectory()); 
}); 
console.log("+++++++++++++++++++++++++++++++++++++++"); 

Hay más información sobre fs.stat(). Usted puede obtener una gran cantidad de información sobre el objeto principal:

fs.stat(path, function(err, stats) { 
     console.log(stats) 
} 

Salida:

{ dev: 2049, 
    ino: 305352, 
    mode: 16877, 
    nlink: 12, 
    uid: 1000, 
    gid: 1000, 
    rdev: 0, 
    size: 4096, 
    blksize: 4096, 
    blocks: 8, 
    atime: '2009-06-29T11:11:55Z', 
    mtime: '2009-06-29T11:11:40Z', 
    ctime: '2009-06-29T11:11:40Z' } 

gran cantidad de elementos es a menudo inútil para nosotros, sí. Pero aquí es el significado de todas estas variables, according to this article:

  • dev: ID del dispositivo que contiene el archivo
  • modo: protección de archivos
  • nlink: número de enlaces duros en el archivo
  • uid: ID de usuario del propietario del archivo.
  • gid: grupo ID del propietario del archivo.
  • rdev: ID del dispositivo si el archivo es un archivo especial.
  • blksize: tamaño de bloque para la E/S del sistema de archivos.
  • ino: Número de inodo del archivo. Un inodo es una estructura de datos del sistema de archivos que -
  • almacena información sobre un archivo.
  • tamaño: tamaño total del archivo en bytes.
  • bloques: cantidad de bloques asignados para el archivo.
  • atime: fecha del objeto que representa la última hora de acceso del archivo.
  • mtime: Fecha en que el objeto representa la última hora de modificación del archivo.
  • ctime: fecha representa la última vez que se modificó el inodo del archivo.

Puede también, como nodeJS documentation says, obtener más información como:

stats.isFile() 
stats.isDirectory() 
stats.isBlockDevice() 
stats.isSymbolicLink() (only valid with fs.lstat()) 
stats.isCharacterDevice() 
stats.isFIFO() 
stats.isSocket() 

Sobre stats.isSymbolicLink(), hay otra función que la fs.stat, llamado fs.lstat(), y aquí es la diferencia entre ellos:

  • stat sigue symlinks. Cuando se le da una ruta que es un enlace simbólico, devuelve la estadística del objetivo del enlace simbólico.
  • lstat no sigue enlaces simbólicos. Cuando se le da una ruta que es un enlace simbólico, devuelve la estadística del enlace simbólico y no su destino.
Cuestiones relacionadas