package org.exist.util; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class DirectoryScanner { private final static String extractBaseDir(final String pattern) { int p = 0; char ch; for (int i = 0; i < pattern.length(); i++) { ch = pattern.charAt(i); if (ch == File.separatorChar || ch == ':') { p = i; continue; } else if (ch == '*' || ch == '?') { if (p > 0) { return pattern.substring(0, p + 1); } } } return null; } public final static List<Path> scanDir(String pattern) throws IOException { //TODO : why this test ? File should make it ! -pb pattern = pattern.replace('/', File.separatorChar).replace('\\', File.separatorChar); String baseDir = extractBaseDir(pattern); if (baseDir == null) { // Dizzzz ##### Why this dependancy? baseDir = System.getProperty("user.dir"); pattern = baseDir + File.separator + pattern; } final Path base = Paths.get(baseDir).normalize(); return scanDir(base, pattern.substring(baseDir.length())); } public final static List<Path> scanDir(final Path baseDir, String pattern) throws IOException { ///TODO : why this test ? File should make it ! -pb pattern = pattern.replace('/', File.separatorChar).replace('\\', File.separatorChar); final List<Path> list = new ArrayList<>(); scanDir(list, baseDir, "", pattern); return list; } private final static void scanDir(final List<Path> list, final Path dir, final String vpath, final String pattern) throws IOException { final List<Path> files = FileUtils.list(dir); for (final Path file : files) { final String name = vpath + FileUtils.fileName(file); if (Files.isDirectory(file) && matchStart(pattern, name)) { scanDir(list, file, name + File.separator, pattern); } else if (match(pattern, name)) { list.add(file); } } } public final static boolean match(String pattern, String name) { return SelectorUtils.matchPath(pattern, name); } public final static boolean matchStart(String pattern, String name) { return SelectorUtils.matchPatternStart(pattern, name); } public static void main(final String args[]) throws IOException { List<Path> files = scanDir("/home/*/xml/**/*.xml"); for (Path file : files) { System.out.println(file.toAbsolutePath().toString()); } files = scanDir("/does-not-exist/*.xml"); for (final Path file : files) { System.out.println(file.toAbsolutePath().toString()); } } }