共计 1314 个字符,预计需要花费 4 分钟才能阅读完成。
最近在应用 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) },
});
});
惋惜它是依照文件的批改工夫排序的。
论断
目前,无奈依照创立工夫排序。
你遇到过这样的问题吗?你用的什么解决办法?欢送来探讨。