2011-12-20 18 views
8

Sto provando a scrivere una funzione che mi dice che un certo percorso è una directory.Problemi a capire come funziona fs.stat()

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

Tuttavia, non stampa mai la risposta.

Se pathname esiste, non chiama la funzione. Se non esiste, genera un'eccezione: ENOENT not a file or directory. Non voglio sapere che esiste il percorso, ma voglio sapere se si tratta di una directory.

Qualcuno può aiutarmi a risolverlo?

risposta

24

Si sta utilizzando la versione sincrona, che non utilizza una richiamata. Invece restituisce semplicemente il risultato. Quindi, o utilizzare il modulo asincrona fs.stat(path, callback) o utilizzare il modulo di sincronizzazione in questo modo:

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

eccellente, grazie! –

1

Come fs.stat() funziona?

Se si desidera utilizzare una funzione di callback fs/asincrono, non utilizzare la versione sincrona, utilizzare fs.stat():

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

Ci sono più informazioni su fs.stat(). È possibile ottenere un sacco di informazioni circa l'oggetto principale:

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

uscita:

{ 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' } 

un sacco di elementi è spesso inutile per noi, sì. Ma qui è il significato di tutte queste variabili, according to this article:

  • dev: ID del dispositivo contenente il file
  • modalità: protezione dei file
  • nlink: numero di hard link al file
  • uid: ID utente del proprietario del file.
  • gid: ID gruppo del proprietario del file.
  • rdev: ID dispositivo se il file è un file speciale.
  • blksize: dimensioni blocco per I/O del file system.
  • ino: Numero di inode del file. Un inode è una struttura di dati del file system che -
  • memorizza le informazioni su un file.
  • dimensioni: dimensioni totali del file in byte.
  • blocchi: numero di blocchi assegnati per il file.
  • atime: data oggetto che rappresenta l'ultimo orario di accesso del file.
  • mtime: data oggetto che rappresenta l'ora dell'ultima modifica del file.
  • ctime: data oggetto che rappresenta l'ultima volta in cui l'inode del file è stato modificato.

È possibile anche, come nodeJS documentation says, ottenere ulteriori informazioni come:

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

Chi stats.isSymbolicLink(), c'è un'altra funzione di fs.stat, chiamato fs.lstat(), e qui è la differenza tra loro:

  • stat segue i collegamenti simbolici. Quando viene assegnato un percorso che è un collegamento simbolico, restituisce la statistica del target del collegamento simbolico.
  • lstat non segue i collegamenti simbolici. Quando viene fornito un percorso che è un link simbolico, restituisce la stat del link simbolico e non il suo target.