@xingqitian/each-dir-tree
Version:
遍历指定的目录树
67 lines (49 loc) • 1.61 kB
JavaScript
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
}