【问题标题】:Having trouble understanding how fs.stat() works无法理解 fs.stat() 的工作原理
【发布时间】:2012-01-24 19:25:43
【问题描述】:

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

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

但是,它从不打印答案。

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

谁能帮我解决它?

【问题讨论】:

  • 它很老了,但也许快速查看一下文档会有所帮助..

标签: node.js stat


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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

    • dev: 包含文件的设备 ID
    • 模式:文件保护
    • nlink:文件的硬链接数
    • uid:文件所有者的用户 ID。
    • 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 不遵循符号链接。当给定一个符号链接的路径时,它返回符号链接的状态,而不是它的目标。

    【讨论】:

      猜你喜欢
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多