Внутри вашего метода 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
});
});
});
};
В этот момент сырой прекрасно. Поскольку это всего лишь прототип, позволяющий дизайнеру легко просматривать и просматривать определенные страницы. К сожалению, при реализации кода он вызывает ошибку. Невозможно прочитать свойство 'isDirectory' неопределенного. Который я считаю странным, как из googling isDirectory, это встроенная функция. – Fenwick17
@ Fenwick17 Я обновил код, чтобы проверить наличие ошибок, которые может вызвать fs.stat. Повторите попытку? Благодарю. –
Добавлен в код и отправился загружать страницу file-list.html, в которой есть переменные «nunjucks», где переменная разметки должна добавлять ссылки. Однако при обновлении он дает ошибку «Невозможно прочитать свойство isDirectory» неопределенного ». Насколько мне известно, у меня есть необходимые пакеты, установленные как fs. – Fenwick17