Nodejs readdir 如何按时间顺序读取文件(夹)列表?

Nodejs readdir 如何按时间顺序读取文件(夹)列表?

#如题

4 回复

Node.js readdir 如何按时间顺序读取文件(夹)列表?

在 Node.js 中,默认情况下使用 fs.readdir() 方法读取目录中的文件时,返回的文件列表是无序的。如果你希望按时间顺序读取文件列表(例如按创建时间或修改时间),则需要手动获取每个文件的元数据,并根据这些元数据进行排序。

示例代码

以下是一个简单的示例代码,展示如何使用 fs.promises.readdirfs.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);
});

解释

  1. 引入模块:我们首先引入 fs.promisespath 模块。
  2. 定义异步函数readDirSortedByTime 函数接受一个目录路径作为参数。
  3. 读取目录:使用 fs.readdir 读取目录中的所有文件和子目录名。
  4. 获取文件统计信息:通过 fs.stat 获取每个文件的详细信息,包括修改时间 (mtime)。
  5. 排序:使用 Array.prototype.sort 方法,根据文件的修改时间对文件进行排序。
  6. 返回结果:最后返回按修改时间排序后的文件列表。

这个方法可以灵活地应用于不同的场景,只需要根据需要调整 stats.sort 中的条件即可。


使用http://nodejs.org/api/fs.html#fs_class_fs_stats,然后自己排序

那这样是不是要读取1次列表+N次stats属性了?

要按时间顺序读取文件或文件夹列表,你可以使用 fs.readdirfs.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));

在这个示例中:

  1. 使用 fs.readdir 读取目录中的文件和文件夹名称。
  2. 遍历每个文件和文件夹,使用 fs.stat 获取其元数据。
  3. 将文件名和修改时间存储在一个数组中。
  4. 使用 Promise.all 确保所有文件状态都已获取完成。
  5. 对文件状态数组进行排序,根据修改时间升序排序。
  6. 返回排序后的文件名数组。

这样就可以按修改时间顺序读取文件或文件夹列表了。

回到顶部