48

对于给定的目录,如何在 Node.JS 中按时间顺序(按日期修改)获取文件列表?我在文件系统文档中没有看到任何内容。

4

5 回答 5

101

试一试。

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; });
于 2012-05-11T23:32:01.100 回答
14

2021,异步/等待使用 fs.promises

const fs = require('fs').promises;
const path = require('path');

async function readdirChronoSorted(dirpath, order) {
  order = order || 1;
  const files = await fs.readdir(dirpath);
  const stats = await Promise.all(
    files.map((filename) =>
      fs.stat(path.join(dirpath, filename))
        .then((stat) => ({ filename, mtime: stat.mtime }))
    )
  );
  return stats.sort((a, b) =>
    order * (b.mtime.getTime() - a.mtime.getTime())
  ).map((stat) => stat.filename);
}

(async () => {
  try {
    const dirpath = __dirname;
    console.log(await readdirChronoSorted(dirpath));
    console.log(await readdirChronoSorted(dirpath, -1));
  } catch (err) {
    console.log(err);
  }
})();
于 2018-07-04T18:40:01.460 回答
2

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)
  );
}
于 2021-05-25T09:47:51.570 回答
0

我最终使用下划线来说明用于排序的统计数据。

第一次使用获取目录中的文件files = fs.readFileSync(directory);(如果目录不存在或读取权限,您可能想尝试捕获错误)

然后将它们传递给如下函数。这将返回您的有序列表。

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 因为它也应该考虑“触摸”文件。

希望有所帮助,

于 2015-09-04T15:03:11.033 回答
-3

你试过fs.readdir()吗?

http://nodejs.org/docs/v0.3.1/api/fs.html#fs.readdir

于 2012-05-11T23:19:30.073 回答