[英]Using Node.JS, how do you get a list of files in chronological order?
对于给定的目录,如何在 Node.JS 中按时间顺序(按修改日期)获取文件列表? 我在文件系统文档中没有看到任何内容。
试一试。
var dir = './'; // your directory
var files = fs.readdirSync(dir);
files.sort(function(a, b) {
return fs.statSync(dir + a).mtime.getTime() -
fs.statSync(dir + b).mtime.getTime();
});
我使用了这些方法的“同步”版本。 您应该根据需要使它们异步。 (可能只是readdir
部分。)
如果您缓存统计信息,您可能会稍微提高性能。
var files = fs.readdirSync(dir)
.map(function(v) {
return { name:v,
time:fs.statSync(dir + v).mtime.getTime()
};
})
.sort(function(a, b) { return a.time - b.time; })
.map(function(v) { return v.name; });
异步版本 (2018)
const fs = require('fs');
const path = require('path');
const util = require('util');
const readdirAsync = util.promisify(fs.readdir);
const statAsync = util.promisify(fs.stat);
async function readdirChronoSorted(dirpath, order) {
order = order || 1;
const files = await readdirAsync(dirpath);
const stats = await Promise.all(
files.map((filename) =>
statAsync(path.join(dirpath, filename))
.then((stat) => ({ filename, stat }))
)
);
return stats.sort((a, b) =>
order * (b.stat.mtime.getTime() - a.stat.mtime.getTime())
).map((stat) => stat.filename);
}
(async () => {
try {
const dirpath = path.join(__dirname);
console.log(await readdirChronoSorted(dirpath));
console.log(await readdirChronoSorted(dirpath, -1));
} catch (err) {
console.log(err);
}
})();
cliffs of insanity
的cliffs of insanity
解决方案的紧凑版本
function readdirSortTime(dir, timeKey = 'mtime') {
return (
fs.readdirSync(dir)
.map(name => ({
name,
time: fs.statSync(`${dir}/${name}`)[timeKey].getTime()
}))
.sort((a, b) => (a.time - b.time)) // ascending
.map(f => f.name)
);
}
我最终使用下划线,因为有机会说明用于排序的统计数据。
1st 使用files = fs.readFileSync(directory);
获取目录中的files = fs.readFileSync(directory);
(如果目录不存在或读取权限,您可能想尝试 catch err)
然后将它们传递给如下所示的函数。 这将返回有序列表。
function orderByCTime(directory, files) {
var filesWithStats = [];
_.each(files, function getFileStats(file) {
var fileStats = fs.statSync(directory + file);
filesWithStats.push({
filename: file,
ctime: fileStats.ctime
});
file = null;
});
return _.sortBy(filesWithStats, 'ctime').reverse();
}
下划线默认按 asc 排序。 我将其反转,因为我需要它以降序排列。
您可以决定按另一个统计信息排序(在此处查看节点 fs 文档)。 我选择使用 ctime,因为它也应该考虑“触摸”文件。
希望有所帮助,
你试过fs.readdir()
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.