Tony Stark
Tony Stark

Reputation: 2468

How do I find/list a file or directory with specific name inside a directory and its subdirectories in Java?

What my file/directory tree on Linux (Redhat) looks like.

/search
├───sub1
│   └───data (directory)
└───sub2
    └───data (file)

What I already tried is listed below.

Example I (I assumed directories are files in Linux and Java knows this)

FileUtils.listFiles(new File("/search"),
                        new NameFileFilter("data"), TrueFileFilter.INSTANCE)
                        .forEach(System.out::println);

Exampe II

FileUtils.listFilesAndDirectories(new File("/search"),
                        new NameFileFilter("data"), TrueFileFilter.INSTANCE)
                        .forEach(System.out::println);

The above code examples does not print "/search/sub1/data" and /search/sub2/data" like I want them to. FileUtils is from http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html.

Does anyone have a solution?

Upvotes: 0

Views: 802

Answers (1)

sol4me
sol4me

Reputation: 15698

You can achieve the same using Java 7 Files.walkFileTree, PathMatcher and FileVisitor like this

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class MyVisitor extends SimpleFileVisitor<Path> {

    PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:data");

    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        if (matcher.matches(dir.getFileName())) {
            System.out.println("dir found " + dir);
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        if (matcher.matches(file.getFileName())) {
            System.out.println("file found " + file);
        }

        return FileVisitResult.CONTINUE;
    }

    public static void main(String[] args) throws IOException {
        Files.walkFileTree(Paths.get("full/path/to/your/search"), new MyVisitor());
    }
}

Upvotes: 1

Related Questions