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

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

【问题讨论】:

    标签: javascript node.js directory


    【解决方案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.stat(path, [callback])(使用 mtime)结合使用来对数组进行排序。 stackoverflow.com/questions/7559555/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-06
          相关资源
          最近更新 更多