使用 Node.JS,如何按时间顺序获取文件列表?

Posted

技术标签:

【中文标题】使用 Node.JS,如何按时间顺序获取文件列表?【英文标题】:Using Node.JS, how do you get a list of files in chronological order? 【发布时间】:2012-05-20 13:00:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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);
  
)();

【讨论】:

【参考方案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)
  );

【讨论】:

【参考方案3】:

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

首先使用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();

下划线sort by asc by default。我根据需要将其倒序排列。

您可以决定按另一个统计数据 (check node fs documentation here) 进行排序。我选择使用 ctime,因为它也应该考虑“触摸”文件。

希望有帮助,

【讨论】:

【参考方案4】:

试一试。

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; );

【讨论】:

getTime() 未定义。【参考方案5】:

你试过fs.readdir()吗?

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

【讨论】:

我认为任何定义的函数都不会为您排序,但您可以将它与fs.stat(path, [callback])(使用 mtime)结合使用来对数组进行排序。 ***.com/questions/7559555/…

以上是关于使用 Node.JS,如何按时间顺序获取文件列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js 顺序读取 csv 文件(使用流 API)

希望制作一个 twitter 机器人,它将按顺序从文件夹中发布图像。使用 node.js

如何确保 Node.js 中的这些函数链按顺序执行(使用 Promise)?

使用node.js按顺序读取目录内所有文件的内容

如何使用 node.js 获取周围无线接入点的列表?

Node.js / Mongoose / 按顺序排序和显示