乐趣区

关于node.js:Nodejs获取Linux系统文件创建时间

最近在应用 Node.js 的 fs.readdir 遇到一个问题,就是想让读出的文件按创立工夫的先后排序。最初论断是,办不了!!!。上面记录一下钻研的过程。

场景还原

有上面这样一个网页利用,读取的是服务器上的文件,fs.readdir 读取到的文件列表是按 文件的批改工夫 排序的,并不是按创立工夫,如果你有强迫症,这个刚好戳中了你的“G”点。

如果咱们批改了第一个文件夹的名称,或者在它外部新增了文件,那么它就会跑到最初一个。(ps:然而我他么就想按最开始的顺序排列啊!!)

那么,咱们不能依照文件创建工夫排序吗?

windows 与 linux 的文件创建工夫

在 windows 零碎上,一个文件有 3 个工夫属性,他们别离是

创立工夫
批改工夫
拜访工夫

linux 上的文件也有三个工夫属性,别离是

拜访工夫(access time 简写为 atime)
批改工夫(modify time 简写为 mtime)
状态批改工夫(change time 简写为 ctime)

很多人误将 linux 零碎上文件的 ctime 对标成 windows 零碎上的创立工夫,这是不对的,ctime 里的字母 c 是 change 的缩写而非 create 的缩写。当文件的元数据发生变化时,ctime 就会产生扭转,比方文件的权限,拥有者,所属的组,硬链接,当然也包含文件内容发生变化。

所以,在 linux 零碎上,无奈取得文件的创立工夫了么?这是一个简单的问题,对于 linux 零碎上为什么不记录文件的创立工夫,有很多的探讨,有人认为文件的创立工夫对于大多数人来说是无用的,能够用其余来代替:

如果文件没有批改过,就等于 mtime,即最初一次 write 工夫
如果文件没有被批改权限过,就等于 ctime,即最初一次应用 chmod 的工夫
如果文件没有被读取过,就等于 atime,即最初一个 read 的工夫

然而呢,总感觉有点鸡肋。

在 stackoverflow 上找到一个办法,本人把读取到的文件列表排序:

return new Promise((resolve, reject) => {fs.readdir(dir, (err, items) => {if (err) return reject(err);
    const files = [];
    items.forEach((item) => {const info = fs.lstatSync(path.join(dir, item));
      const h = m.encode(path.resolve(dir, item));
      files.push({
        name: item,
        extension: info.isDirectory() ? 'directory' : item.split('.').pop().toLowerCase(),
        hash: h,
        size: info.size,
        is_dir: info.isDirectory(),
        time: info.mtime.getTime()});
  });
  resolve({
    success: true,
    data: {tree: files.sort((a, b) => a.time - b.time) },
  });
});

惋惜它是依照文件的批改工夫排序的。

论断

目前,无奈依照创立工夫排序。

你遇到过这样的问题吗?你用的什么解决办法?欢送来探讨。

退出移动版