findNamedFiles method

Future<List<String>> findNamedFiles({
  1. required String root,
  2. required Set<String> names,
  3. int maxDepth = 6,
  4. Set<String> protectedNames = const {'.git', '.idea', '.vscode', 'node_modules', 'Library', 'Applications', 'System', 'Volumes'},
})

Implementation

Future<List<String>> findNamedFiles({
  required String root,
  required Set<String> names,
  int maxDepth = 6,
  Set<String> protectedNames = const {
    '.git',
    '.idea',
    '.vscode',
    'node_modules',
    'Library',
    'Applications',
    'System',
    'Volumes',
  },
}) 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) {
      final basename = p.basename(child.path);
      if (child is File && names.contains(basename)) {
        results.add(child.path);
        continue;
      }
      if (child is Directory) {
        if (protectedNames.contains(basename) ||
            basename.startsWith('.Trash')) {
          continue;
        }
        await walk(child, depth + 1);
      }
    }
  }

  await walk(Directory(root), 0);
  return results;
}