Skip to content

Commit

Permalink
feat(fs): 新增 findFiles 文件查找函数,以满足简单的目录文件查找需求
Browse files Browse the repository at this point in the history
  • Loading branch information
renxia committed Aug 2, 2024
1 parent a9b8df5 commit 84b1687
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/node/fs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,34 @@ export function rmEmptyDir(dir: string) {

if (files.length === 0) return fs.rmdirSync(dir);
}

/**
* 一个查找文件函数。递归地在源目录中查找符合条件的文件,并将找到的文件路径添加到数组中返回。
*
* @param {string} srcDir - 需要查找的源目录,如果未指定或指定的目录不存在,则直接返回空数组。
* @param {function} validate - 验证函数,用于判断文件是否符合条件。如果未指定或验证失败,则直接返回空数组。
* @param {number} limit - 限制返回的文件数量,默认值为99999。当找到的文件数量达到这个值时,停止查找并返回结果。
* @return {string[]} 返回一个包含所有找到的文件路径的字符串数组。如果没有找到任何文件,或者因为达到了限制而停止查找,则返回空数组。
*/
export function findFiles(srcDir?: string, validate?: (filepath: string, stat: Stats) => boolean, limit = 99999) {
const files: string[] = [];

if (!srcDir || !fs.existsSync(srcDir)) return files;

const stat = fs.statSync(srcDir);

if (validate && !validate(srcDir, stat)) return files;

if (stat.isFile()) return [resolve(srcDir)];

if (stat.isDirectory()) {
for (const filename of fs.readdirSync(srcDir)) {
for (const f of findFiles(resolve(srcDir, filename), validate, limit - files.length)) {
files.push(f);
if (limit > 0 && files.length >= limit) return files;
}
}
}

return files;
}

0 comments on commit 84b1687

Please sign in to comment.