最近在应用 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) }, });});
惋惜它是依照文件的批改工夫排序的。
论断
目前,无奈依照创立工夫排序。
你遇到过这样的问题吗?你用的什么解决办法?欢送来探讨。