2016-09-27 3 views
1

В настоящее время работает над небольшим проектом и имеет несколько проблем с получением файлов для печати на странице. В настоящее время все файлы в каталоге my/views будут напечатаны, однако я хочу расширить это, чтобы он мог печатать файлы в папках, например, /views/test/prototype.html.Node.js print directory files

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

ответ

0

Внутри вашего метода getFiles, вы можете добавить некоторые дополнительные логику, чтобы увидеть, если файл, который вы в настоящее время синтаксического анализа является каталогом, случай, в котором вы можете перебираем файлы в этом каталоге и нажимаем их на массив результирующего набора (filesArray). Мой пример ниже только учитывает уровень счета 2 папки, например, в /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, что позволяет вам лучше контролировать асинхронный цикл и убедиться, что вы разобрали все отдельные файлы перед вызовом markup().

UPDATE # 1 Я пытался различные подходы к попытке просканировать все каталоги и подкаталоги, используя обещания, не имел успеха, но мне удалось наткнуться рабочим раствором для вашего сценария в этом Stack Overflow accepted answer - к точнее, это механизм параллельного поиска, предусмотренный в вышеупомянутом ответе.

Ниже адаптация параллельного механизма поиска, смешанный с использованием существующей базой коды - Я проверил его и он работает как задумано:

var fs = require('fs'); 
var path = require('path'); 

module.exports = function (router) { 
    router.get('/file-list', function (req, res) { 
     var getFiles = function (callback) { 
      var rootDir = path.join(__dirname, 'views'); 

      walk(rootDir, function (err, results) { 
       if (err) { 
        console.log(err); 
        return; 
       } 

       markup(results, callback); 
      }); 

     }; 

     var walk = function (dir, done) { 
      var results = []; 

      fs.readdir(dir, function (err, list) { 
       if (err) { 
        return done(err); 
       } 

       var pending = list.length; 

       if (!pending) { 
        return done(null, results); 
       } 

       list.forEach(function (file) { 
        file = path.resolve(dir, file); 

        fs.stat(file, function (err, stat) { 
         if (stat && stat.isDirectory()) { 
          walk(file, function (err, res) { 
           results = results.concat(res); 

           if (!--pending) { 
            done(null, results); 
           } 
          }); 
         } else { 
          results.push(file); 

          if (!--pending) { 
           done(null, results); 
          } 
         } 
        }); 
       }); 
      }); 
     }; 

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

     getFiles(function (items) { 

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

В этот момент сырой прекрасно. Поскольку это всего лишь прототип, позволяющий дизайнеру легко просматривать и просматривать определенные страницы. К сожалению, при реализации кода он вызывает ошибку. Невозможно прочитать свойство 'isDirectory' неопределенного. Который я считаю странным, как из googling isDirectory, это встроенная функция. – Fenwick17

+0

@ Fenwick17 Я обновил код, чтобы проверить наличие ошибок, которые может вызвать fs.stat. Повторите попытку? Благодарю. –

+0

Добавлен в код и отправился загружать страницу file-list.html, в которой есть переменные «nunjucks», где переменная разметки должна добавлять ссылки. Однако при обновлении он дает ошибку «Невозможно прочитать свойство isDirectory» неопределенного ». Насколько мне известно, у меня есть необходимые пакеты, установленные как fs. – Fenwick17

0

Вы должны изучить files массив с fs.stat и рекурсивно сделать getFiles каталогами.

This answer решает подобную проблему