递归读取目录不是问题。有很多不错的库,例如recursive-readdir。
我正在寻找一种解决方案,以提取仅个不包含任何文件等的文件夹结构。
示例文件夹结构:
src/app/_content
├── contact.md
├── disclaimer.md
├── imprint.md
├── index.md
├── news.md
├── vita.md
└── work
├── drawing
│ └── Z-WV-2018-001
│ ├── index.md
│ └── Z-WV-2018-001-0.jpeg
└── sculpture
└── EMPTY DIRECTORY
希望输出是这样的数组:
const dirs = [
'work',
'work/drawing',
'work/sculpture'
]
这不应该那么难,但是除此之外,我将需要在第二步中提取一个像这样的对象:
const files = [
'content.md',
'disclaimer.md',
'imprint.md',
'index.md',
'news.md',
'vita.md',
{
'work': [
{
'drawing': [
{
'Z-WV-2018-001': [
'index.md',
'Z-WV-2018-001-0.jpeg'
],
},
{
'sculpture': []
}
]
}
]
}
]
浏览器应用程序需要 dirs
才能知道文件的路径。 files
将需要从目录中获取相应的文件。
为澄清起见,我正在使用Angular 6构建静态页面生成器,并且无法从客户端读取文件夹结构。因此,有必要编译该结构并将其与nodejs脚本一起放入已发布的文件夹中。因此Angular会知道在哪里寻找这些文件。
如果需要更多说明,请写评论。我只是想尽可能的精确。
答案 0 :(得分:1)
您可以使用fs.stat
方法或它的同步版本:fs.statSync
。该方法返回一个fs.Stats
实例。 fs.Stats
个实例具有.isDirectory
方法,当路径为目录时,该方法返回true
。
const fs = require('fs');
fs.stat('/pathname', (err, stats) => {
if (err) throw err;
const isDir = stats.isDirectory();
// ...
});
您需要为每个路径名调用fs.stat
函数。
如果可以选择使用库,则也可以使用draxt
package:
const $ = require('draxt');
(async() {
const $app = await $('src/app/_content/**');
const $dirs = $app.directories();
// dirs is a draxt collection of directories
const dirPaths = $dirs.map(el => el.pathName);
// dirPaths is an array of directories' absolute pathNames
}());
答案 1 :(得分:1)
您提供的库使您能够自定义其在搜索过程中忽略的内容。您应该能够执行以下操作(免责声明:尚未测试过):
const recursive = require("recursive-readdir");
function ignoreFiles(file, stats) {
return !stats.isDirectory();
}
recursive("some/path", [ignoreFiles], function (err, dirs) {
console.log(dirs);
});
答案 2 :(得分:0)
const klawSync = require('klaw-sync')
const dir = 'src/app/_content'
const files = klawSync(dir, {
nofile: true
})
console.log(files.map(item => {
return item.path.slice(item.path.indexOf(dir) + dir.length + 1)
}))
肯定会针对该问题提供本机解决方案,但是我决定借助外部模块klaw-sync
来解决该问题。