Having trouble understanding how fs.stat() works


Question

I'm trying to write a function that tells me is a certain path is a directory.

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

However, it never prints the answer.

If pathname exists - it doesn't call the function. If it doesn't exists, it generates an exception: ENOENT not a file or directory. I don't want to know it pathname exists, but I want to know if it's a directory.

Can anyone help me fix it?

1
14
1/15/2013 11:41:07 AM

Accepted Answer

You are using the synchronous version, which doesn't use a callback. It simply returns the result instead. So either use the async form fs.stat(path, callback) or use the sync form like this:

var fs = require('fs');
console.log("+++++++++++++++++++++++++++++++++++++++");
var stats = fs.statSync(pathname);
console.log(stats.isDirectory());
console.log("+++++++++++++++++++++++++++++++++++++++");
28
12/20/2011 9:19:03 PM

How fs.stat() works ?

If you want to use a callback/async fs function, don't use the synchronous version, use fs.stat() :

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

There is more information about fs.stat(). You can get a lot of information about the main object :

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

Output :

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

Lots of elements is often useless for us, yes. But here is the signification of all of these variables, according to this article :

  • dev: ID of the device containing the file
  • mode: file protection
  • nlink: number of hard links to the file
  • uid: user ID of the file’s owner.
  • gid: group ID of the file’s owner.
  • rdev: device ID if the file is a special file.
  • blksize: block size for file system I/O.
  • ino: File inode number. An inode is a file system data structure that -
  • stores information about a file.
  • size: file total size in bytes.
  • blocks: number of blocks allocated for the file.
  • atime: date object representing the file’s last access time.
  • mtime: date object representing the file’s last modification time.
  • ctime: date object representing the last time the file’s inode was changed.

You can also, like nodeJS documentation says, get more information like :

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

About stats.isSymbolicLink(), there is another function than fs.stat, called fs.lstat(), and here is the difference between them :

  • stat follows symlinks. When given a path that is a symlink, it returns the stat of the target of the symlink.
  • lstat doesn't follow symlinks. When given a path that is a symlink it returns the stat of the symlink and not its target.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon