无法理解fs.stat()的工作原理

Ash*_*ban 14 stat node.js

我正在尝试编写一个函数,告诉我某个路径是一个目录.

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

但是,它从未打印出答案.

如果pathname存在 - 它不会调用该函数.如果它不存在,则会生成异常:ENOENT not a file or directory.我不想知道它存在路径名,但我想知道它是否是一个目录.

任何人都可以帮我修复它吗?

Ale*_*yne 29

您正在使用同步版本,该版本不使用回调.它只是返回结果.因此要么使用异步表单,fs.stat(path, callback)要么使用这样的同步表单:

var fs = require('fs');
console.log("+++++++++++++++++++++++++++++++++++++++");
var stats = fs.statSync(pathname);
console.log(stats.isDirectory());
console.log("+++++++++++++++++++++++++++++++++++++++");
Run Code Online (Sandbox Code Playgroud)


Art*_*ste 8

fs.stat()如何工作?

如果要使用回调/异步fs函数,请不要使用同步版本,请使用fs.stat():

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

有关fs.stat()的更多信息.您可以获得有关主要对象的大量信息:

fs.stat(path, function(err, stats) {
      console.log(stats)
}
Run Code Online (Sandbox Code Playgroud)

输出:

{ 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' }
Run Code Online (Sandbox Code Playgroud)

对我们来说,很多元素通常都是无用的,是的.但是根据这篇文章,这里是所有这些变量的意义:

  • dev:包含该文件的设备的ID
  • 模式:文件保护
  • nlink:文件的硬链接数
  • uid:文件所有者的用户ID.
  • gid:文件所有者的组ID.
  • rdev:设备ID,如果文件是特殊文件.
  • blksize:文件系统I/O的块大小.
  • ino:文件inode编号.inode是一个文件系统数据结构 -
  • 存储有关文件的信息.
  • size:文件总大小(以字节为单位).
  • blocks:为文件分配的数.
  • atime:表示文件上次访问时间的日期对象.
  • mtime:表示文件上次修改时间的日期对象.
  • ctime:表示文件的inode更改的最后时间的日期对象.

您也可以像nodeJS文档所说的那样获取更多信息,例如:

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isCharacterDevice()
stats.isFIFO()
stats.isSocket()
Run Code Online (Sandbox Code Playgroud)

关于stats.isSymbolicLink(),还有另一个函数而不是fs.stat,名为fs.lstat(),这里是它们之间的区别:

  • stat遵循符号链接.当给定一个符号链接的路径时,它返回符号链接的目标的统计信息.
  • lstat不遵循符号链接.当给定一个符号链接的路径时,它返回符号链接的统计信息,而不是其目标.