2011-12-20 50 views
8

我試圖編寫一個函數,告訴我是某個路徑是一個目錄。無法理解fs.stat()如何工作

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

但是,它從不打印答案。

如果路徑名存在 - 它不會調用該函數。 如果它不存在,它會生成一個異常:ENOENT not a file or directory。 我不想知道它存在的路徑名,但我想知道它是否是一個目錄。

任何人都可以幫我修復它嗎?

回答

24

您正在使用同步版本,它不使用回調。它只是返回結果。因此,無論使用異步形式fs.stat(path, callback)或使用同步的形式是這樣的:

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

優秀的,謝謝! – 2011-12-20 21:28:39

1

如何fs.stat()的作品?

如果你想使用一個回調/異步FS功能,不使用同步版本,使用fs.stat():

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

有關於fs.stat()的更多信息。你可以得到很多信息有關的主要對象:

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

輸出:

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

很多元素往往是無用的對我們來說,是的。但這裏是所有這些變量的意義,according to this article

  • 開發:包含文件的設備的 ID
  • 模式:文件保護
  • NLINK:數量的硬鏈接到文件
  • uid:文件所有者的用戶標識。
  • gid:文件所有者的組ID。
  • rdev:設備ID,如果該文件是一個特殊文件。
  • blksize:文件系統I/O的塊大小。
  • ino:文件inode號碼。 inode是一個文件系統數據結構 -
  • 存儲有關文件的信息。
  • 大小:文件總大小(以字節爲單位)。
  • blocks:爲文件分配的塊數。
  • 的atime:代表文件的最後訪問時間日期對象。
  • 的mtime:代表文件的最後修改時間日期對象。
  • 的ctime:代表最後時刻的文件的inode改變日期對象。

你也可以像nodeJS documentation says,獲得更多的信息,如:

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

關於stats.isSymbolicLink(),還有比fs.stat另一個函數,稱爲fs.lstat(),並在這裏是它們之間的差異:

  • stat遵循符號鏈接。當給定一個符號鏈接路徑時,它將返回符號鏈接目標的統計信息。
  • lstat不符合符號鏈接。當給定一個符號鏈接的路徑時,它將返回符號鏈接的統計信息,而不是其目標。