【问题标题】:Is there any way to retrieve a file / folder's unique ID via NodeJS?有什么方法可以通过 NodeJS 检索文件/文件夹的唯一 ID?
【发布时间】:2017-08-27 11:46:16
【问题描述】:

我面临的问题很简单。我想跟踪文件/文件夹,即使它已被重命名/删除等? NodeJS 是否提供了一种访问文件信息的方法?我已经尝试过默认文件系统模块 fs.stats() : https://nodejs.org/api/fs.html#fs_class_fs_stats 。不幸的是,它似乎没有为特定文件提供这种唯一的 ID 引用。

NodeJS中是否存在这样的解决方案?

注意:我不想为文件生成唯一 ID。将随机字符串分配给文件并将字符串与 this 关联起来非常容易。但情况恰恰相反。我想将文件与某种系统范围的字符串相关联。

感谢任何帮助。

【问题讨论】:

  • “我面临的问题很简单”。好吧,只是在描述它。首先,如果存在这样的标识符,它既依赖于操作系统,也依赖于文件系统。其次,听起来您还希望能够使用该唯一标识符访问文件/文件夹,我认为这对于大多数操作系统来说是不可能的。也许使用像chokidar 这样的文件系统观察器是您真正在寻找的东西?
  • 严格来说,我并不是指访问。我可以编写一个简单的脚本来将每个文件 id 映射到它的路径。此后,我可以将此作为我的指导原则。然而,潜在的问题是获取此文件 ID。
  • 好的,这样的话,给出的答案对你来说应该足够了:)
  • 您要解决的实际问题是什么?您已经描述了您正在尝试的解决方案,但没有告诉我们您要解决的实际问题是什么,从而剥夺了您自己其他可能的解决方案的想法,并告诉我们真正的问题是什么,以便我们可以更广泛地思考关于解决方案(这在stackoverflow上很常见)。人们用他们的解决方案描述一个问题,而不是描述实际的原始问题。
  • @jfriend00 问题在于模组链接到共享共同关键字/关注点的任意问题。看到模组很容易将问题标记为重复,连接一些任意问题并继续前进,这非常令人沮丧。广义地说,这个问题很简单。如何为 NodeJS 上的文件获取唯一的“ID”?我确信操作系统会使用某种 ID 来跟踪它的文件。我使用fs 模块作为快速解决方案。如果有更好的选择,请告诉我们:)

标签: node.js file file-rename


【解决方案1】:

看链接https://nodejs.org/api/fs.html#fs_class_fs_stats

Stats {
  dev: 2114,
  ino: 48064969,
  mode: 33188,
  nlink: 1,
  uid: 85,
  gid: 100,
  rdev: 0,
  size: 527,
  blksize: 4096,
  blocks: 8,
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT }

我可以看到 unix inode 编号。

两个文件可以有相同的inode号吗?

两个文件可以有相同的 inode,但前提是它们属于不同的分区。 索引节点仅在分区级别上是唯一的,而不是在整个系统上。

因此,除了inode号之外,还比较设备号。

var uniqueFileId[fileName] = (Stats.dev + Stats.ino)

【讨论】:

  • 这是一个跨平台的解决方案吗?我的意思是,fs.stats 是否适用于所有平台?
  • @robertklep 怎么样?同一驱动器上的 2 个文件代表同一分区上的文件。我猜 inode nuber 是 UNIX 特有的吗?但是,出于某种原因,fs.stats 也为 Windows 上的文件/文件夹提供了一个 Inode 编号。这是预期的行为吗?
  • @SaiKrishnaDeep 问题是 Windows 上的“inode”是 64 位数字,无法在 JavaScript 数字中正确表示。这可能导致不同的文件看起来具有相同的ino 值。见this remark about Node v7。还有this issue.
  • @RatanKumar 主要区别在于对于大多数类 Unix 操作系统,inode 编号是 32 位,而在 Windows(以及即将推出的新 macOS 文件系统 APFS)上,它们是 64 -少量。这些不能在 JS 中表示为数字。它似乎可以工作,直到您点击标识符被截断为 Number.MAX_SAFE_INTEGER 的文件/文件夹。
  • 我认为包含另一个字符串,如 ctime,birthime,atime 可能是一个小的解决方法。
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2020-02-10
相关资源
最近更新 更多