如何使用nodeJS导出本地文件夹结构?

时间:2018-10-20 16:58:26

标签: javascript node.js recursion readdir

递归读取目录不是问题。有很多不错的库,例如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会知道在哪里寻找这些文件。

如果需要更多说明,请写评论。我只是想尽可能的精确。

3 个答案:

答案 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来解决该问题。