Node.js打印目录文件

时间:2016-09-27 11:27:15

标签: javascript node.js

目前正在处理一个小项目,并且在将文件打印到页面上时遇到一些问题。 目前,我/ views目录中的所有文件都将打印,但是,我想扩展它以便它可以在文件夹中打印文件,例如/views/test/prototype.html。

module.exports = function (router) {

  var fs = require('fs');

  router.get('/file-list', function (req, res) {

    var markup = function (files, callback) {
      var items = [];
      for (i = 0; i < files.length; i++) {
        var q = files[i];
        q = q.slice(0, -5);
        var markup = '<li>' + '<a href="' + q + '">' + q + '</a>' + '</li>';
        items.push(markup);
      };
      callback(items);
    };

    var getFiles = function (callback) {
      fs.readdir(__dirname + '/views', function (err, files) { // '/' denotes the root folder
        if (err) throw err;
        markup(files, callback)
      });
    };

    getFiles(function (items) {

      // render markup for items
      res.render('file-list', { 'files': items });
    });
  });
}

2 个答案:

答案 0 :(得分:0)

您需要使用fs.stat检查files数组,并在目录上递归执行getFiles

This answer解决了类似的问题

答案 1 :(得分:0)

DATETIME方法中,您可以添加一些额外的逻辑来查看当前正在解析的文件是否是一个目录,在这种情况下,您可以循环遍历该目录中的文件并将其推送到结果设置数组(getFiles)。我的下面的示例仅考虑了2级文件夹,例如您提供的filesArray方案:

/views/test/prototype.html

上面的示例是粗略的,因为建议使用诸如 module.exports = function (router) { var fs = require('fs'); router.get('/file-list', function (req, res) { var markup = function (files, callback) { var items = []; for (i = 0; i < files.length; i++) { var q = files[i]; q = q.slice(0, -5); var markup = '<li>' + '<a href="' + q + '">' + q + '</a>' + '</li>'; items.push(markup); }; callback(items); }; var getFiles = function (callback) { var rootDir = __dirname + '/views'; fs.readdir(rootDir, function (err, files) { // '/' denotes the root folder if (err) throw err; // Subdirectory parsing logic START var filesArray = []; for (var i = 0; i < files.length; i++) { var subdirPath = rootDir + '/' + files[i]; fs.stat(subdirPath, function (err, stats) { if (err) { console.log(err); throw err; } if (stats.isDirectory()) { fs.readdir(subdirPath, function (err, subdirFiles) { if (err) throw err; Array.prototype.forEach.call(subdirFiles, function (file) { filesArray.push(file); }); }); } else { filesArray.push(files[i]); } }); } // Subdirectory parsing logic END markup(filesArray, callback) }); }; getFiles(function (items) { // render markup for items res.render('file-list', { 'files': items }); }); }); } 之类的机制,它允许您更好地控制异步循环,并确保您之前已经解析了所有单个文件致电Promises

更新#1 我一直在尝试使用promises尝试抓取所有目录和子目录的各种方法,但没有成功,但我确实设法在此Stack Overflow accepted answer中为您的方案找到了一个可行的解决方案 - 更确切地说,它是上述答案中提供的并行搜索机制。

下面是对您现有代码库中混合使用的并行搜索机制的改编 - 我已对其进行了测试,并且按预期工作:

markup()