Multi-level Directory Matching with Custom Rules

Directory Scanning with Pattern Matching

Efficiently scan nested directoyr structures while filtering directories at each level using custom pattern matching rules. This approach avoids unnecsesary scans of irrelevant directories in deep folder structures.

1. Directory Filter Implementation

The DirectoryFilter class processes matching rules and validaets directories against hierarchical requirements:

public class DirectoryPatternFilter implements FileFilter {
    private static final String LEVEL_SEPARATOR = "#";
    private final String[] patterns;
    private final int maxDepth;
    private int currentLevel;

    public DirectoryPatternFilter(String patternRules) {
        this.patterns = patternRules.split(LEVEL_SEPARATOR);
        this.maxDepth = patterns.length;
    }

    public void setCurrentLevel(int level) {
        this.currentLevel = level;
    }

    public boolean isFinalLevel() {
        return this.currentLevel == this.maxDepth - 1;
    }

    @Override
    public boolean accept(File directory) {
        if (currentLevel >= maxDepth) {
            return false;
        }
        return directory.isDirectory() && 
               Pattern.compile(patterns[currentLevel]).matcher(directory.getName()).find();
    }
}

2. Core Scanning Logic

The scanner processes directories level by level according to the pattern rules:

public class PatternDirectoryScanner {

    public List<File> scanFiles(String rootPath, String patternRules) {
        File rootDir = new File(rootPath);
        if (rootDir.isDirectory()) {
            List<File> resultFiles = new ArrayList<>();
            DirectoryPatternFilter filter = new DirectoryPatternFilter(patternRules);
            List<File> targetDirs = findMatchingDirectories(rootDir, filter, 0);
            
            for (File dir : targetDirs) {
                File[] files = dir.listFiles(File::isFile);
                if (files != null && files.length > 0) {
                    resultFiles.addAll(Arrays.asList(files));
                }
            }
            return resultFiles;
        }
        return Collections.emptyList();
    }

    private List<File> findMatchingDirectories(File currentDir, 
                                             DirectoryPatternFilter filter,
                                             int currentLevel) {
        List<File> matches = new ArrayList<>();
        if (currentDir.isDirectory()) {
            filter.setCurrentLevel(currentLevel);
            File[] subDirs = currentDir.listFiles(filter);
            
            if (filter.isFinalLevel()) {
                matches.addAll(Arrays.asList(subDirs));
            }
            
            for (File subDir : subDirs) {
                matches.addAll(findMatchingDirectories(subDir, filter, currentLevel + 1));
            }
        }
        return matches;
    }
}

3. Usage Example

public static void main(String[] args) {
    String basePath = "D:/projects";
    String matchingPattern = "src#.*#com.*";
    List<File> matchedFiles = new PatternDirectoryScanner().scanFiles(basePath, matchingPattern);
}

Tags: java FileFilter DirectoryScanner PatternMatching filesystem

Posted on Sat, 18 Jul 2026 16:08:40 +0000 by bradymills