Как экспортировать структуру локальной папки с помощью nodeJS? - PullRequest
0 голосов
/ 20 октября 2018

Повторное чтение каталогов не является проблемой.Для этого есть много хороших библиотек, например 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 голосов
/ 20 октября 2018

Библиотека, которую вы предоставили, дает вам возможность настроить то, что она игнорирует при поиске.Вы должны быть в состоянии сделать что-то вроде этого (отказ от ответственности: не проверял это):

const recursive = require("recursive-readdir");

function ignoreFiles(file, stats) {
  return !stats.isDirectory();
}

recursive("some/path", [ignoreFiles], function (err, dirs) {
  console.log(dirs);
});
0 голосов
/ 22 октября 2018
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.

0 голосов
/ 20 октября 2018

Вы можете использовать метод fs.stat или его синхронную версию: fs.statSync.Метод возвращает экземпляр fs.Statsfs.Stats экземпляров есть метод .isDirectory, который возвращает true, когда путь является каталогом.

const fs = require('fs');
fs.stat('/pathname', (err, stats) => {
    if (err) throw err;
    const isDir = stats.isDirectory();
    // ...
});

Вам необходимо вызывать функцию fs.stat для каждого пути.

Если вы можете использовать библиотеку, вы также можете использовать пакет draxt :

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