findNamedDirectories method
Future<List<String>>
findNamedDirectories(
{ - required String root,
- required Set<String> names,
- int maxDepth = 6,
- Set<String> protectedNames = const {'.git', '.idea', '.vscode', 'node_modules', 'Library', 'Applications', 'System', 'Volumes', 'private'},
})
Implementation
Future<List<String>> findNamedDirectories({
required String root,
required Set<String> names,
int maxDepth = 6,
Set<String> protectedNames = const {
'.git',
'.idea',
'.vscode',
'node_modules',
'Library',
'Applications',
'System',
'Volumes',
'private',
},
}) async {
final results = <String>[];
if (!Directory(root).existsSync()) return results;
Future<void> walk(Directory directory, int depth) async {
if (depth > maxDepth) return;
List<FileSystemEntity> children;
try {
children = await directory.list(followLinks: false).toList();
} on FileSystemException {
return;
}
for (final child in children) {
if (child is! Directory) continue;
final basename = p.basename(child.path);
if (names.contains(basename)) {
results.add(child.path);
continue;
}
if (protectedNames.contains(basename) ||
basename.startsWith('.Trash')) {
continue;
}
await walk(child, depth + 1);
}
}
await walk(Directory(root), 0);
return results;
}