UNPKG

@xingqitian/each-dir-tree

Version:

遍历指定的目录树

67 lines (49 loc) 1.61 kB
const { Minimatch } = require("minimatch"); const fs = require("fs"); const path = require("path"); const generateIgnores = (ignores) => { ignores = ignores.map(ignore => new Minimatch(ignore, { matchBase: true })) if (!ignores.length) return () => true return filePath => !ignores.some(minimatch => minimatch.match(filePath)) } const eachDirTree = (callback, dirPath, ignores = [], _privateOptions = {}) => { const check = _privateOptions.check || generateIgnores(ignores) const files = fs.readdirSync(dirPath) for (let i = 0; i < files.length; i++) { const filePath = path.join(dirPath, files[i]) const stat = fs.lstatSync(filePath) if (!check(filePath)) { continue } const isDirectory = stat.isDirectory() const userData = callback({ path: filePath, isDirectory }, _privateOptions.userData) if (isDirectory) { eachDirTree(callback, filePath, null, { check, userData }) } } } const dirFileList = (dirPath, ignores = []) => { const fileList = []; eachDirTree(fileInfo => !fileInfo.isDirectory && fileList.push(fileInfo.path), dirPath, ignores) return fileList } const dirTree = (dirPath, ignores = []) => { const tree = [] eachDirTree((fileInfo, userData) => { if (userData) { if (!userData.children) { userData.children = []; } userData.children.push(fileInfo) } else { tree.push(fileInfo) } return fileInfo }, dirPath, ignores) return tree } module.exports = { eachDirTree, dirFileList, dirTree }