Nodejs readdir 如何按时间顺序读取文件(夹)列表?
Nodejs readdir 如何按时间顺序读取文件(夹)列表?
#如题
4 回复
Node.js readdir
如何按时间顺序读取文件(夹)列表?
在 Node.js 中,默认情况下使用 fs.readdir()
方法读取目录中的文件时,返回的文件列表是无序的。如果你希望按时间顺序读取文件列表(例如按创建时间或修改时间),则需要手动获取每个文件的元数据,并根据这些元数据进行排序。
示例代码
以下是一个简单的示例代码,展示如何使用 fs.promises.readdir
和 fs.promises.stat
方法来按修改时间对文件进行排序:
const fs = require('fs').promises;
const path = require('path');
async function readDirSortedByTime(dirPath) {
try {
// 读取目录中的文件和子目录
const items = await fs.readdir(dirPath);
// 获取每个文件的统计信息(包括修改时间)
const stats = await Promise.all(items.map(async item => {
const fullPath = path.join(dirPath, item);
const stats = await fs.stat(fullPath);
return { item, stats };
}));
// 按修改时间排序
stats.sort((a, b) => a.stats.mtime.getTime() - b.stats.mtime.getTime());
// 返回按修改时间排序后的文件列表
return stats.map(stat => stat.item);
} catch (error) {
console.error(`Error reading directory: ${error}`);
return [];
}
}
// 使用示例
const dirPath = './your-directory-path';
readDirSortedByTime(dirPath).then(files => {
console.log('Files sorted by modification time:', files);
});
解释
- 引入模块:我们首先引入
fs.promises
和path
模块。 - 定义异步函数:
readDirSortedByTime
函数接受一个目录路径作为参数。 - 读取目录:使用
fs.readdir
读取目录中的所有文件和子目录名。 - 获取文件统计信息:通过
fs.stat
获取每个文件的详细信息,包括修改时间 (mtime
)。 - 排序:使用
Array.prototype.sort
方法,根据文件的修改时间对文件进行排序。 - 返回结果:最后返回按修改时间排序后的文件列表。
这个方法可以灵活地应用于不同的场景,只需要根据需要调整 stats.sort
中的条件即可。
使用http://nodejs.org/api/fs.html#fs_class_fs_stats,然后自己排序
那这样是不是要读取1次列表+N次stats属性了?
要按时间顺序读取文件或文件夹列表,你可以使用 fs.readdir
和 fs.stat
方法结合来实现。具体步骤是先读取目录中的文件和文件夹名称,然后通过 fs.stat
获取每个文件或文件夹的元数据,从中提取出修改时间,并根据时间排序。
以下是一个示例代码:
const fs = require('fs');
const path = require('path');
function readDirByTime(dirPath) {
return new Promise((resolve, reject) => {
fs.readdir(dirPath, (err, files) => {
if (err) {
reject(err);
return;
}
const fileStats = [];
files.forEach(file => {
fs.stat(path.join(dirPath, file), (err, stats) => {
if (err) {
reject(err);
return;
}
fileStats.push({ name: file, mtime: stats.mtime });
});
});
// 等待所有文件状态获取完成
Promise.all(fileStats.map(stat => stat.mtime)).then(stats => {
// 按修改时间排序
fileStats.sort((a, b) => a.mtime - b.mtime);
// 返回排序后的文件名数组
resolve(fileStats.map(fileStat => fileStat.name));
});
});
});
}
// 使用示例
readDirByTime('./your-directory')
.then(files => console.log(files))
.catch(err => console.error(err));
在这个示例中:
- 使用
fs.readdir
读取目录中的文件和文件夹名称。 - 遍历每个文件和文件夹,使用
fs.stat
获取其元数据。 - 将文件名和修改时间存储在一个数组中。
- 使用
Promise.all
确保所有文件状态都已获取完成。 - 对文件状态数组进行排序,根据修改时间升序排序。
- 返回排序后的文件名数组。
这样就可以按修改时间顺序读取文件或文件夹列表了。