Commons-IO: DirectoryWalker

by Haf
19.07.2009
tags: , ,
 

Commons-IO bzw. allg. Apache Commons ist eine schöne Ansammlung von nützlichen Bibliotheken und Funktionen.
Darunter ist auch Commons-IO zu finden. Daraus will ich heute eine spezielle Lösung vorstellen.
Hat man folgendes Problem:
Möchte man einen Ordner, inklusive dessen Unterordner, nach bestimmten Dateien suchen und dann diese vielleicht nach Last-Modified sortiert, bietet Commons-IO eine Lösung an.

Um den/die Ordner durchzulaufen existiert ein DirectoryWalker.
Um den abstrakten DirectoryWalker nutzen zu können könnte man z.B. eine folgende Implementierung nutzen:

public class TestDirectoryWalker extends DirectoryWalker {

	public TestDirectoryWalker(IOFileFilter dirFilter, IOFileFilter fileFilter, int depth) {
		super(dirFilter, fileFilter, depth);
	}

        /**
          * This method sets the start directory and starts the DirectoryWalker.
          */
	public List search(File startDir) throws IOException {

		List results = new ArrayList();
		walk(startDir, results);
		return results;
	}

	protected boolean handleDirectory(File directory, int depth, Collection results) {
		// return true, cause every sub directory is allowed
		return true;
	}

	protected void handleFile(File file, int depth, Collection results) {		

                // we want only the files with the name "abc.txt" in the
                // subdirectories. This files will be inserted in the given
                // result collection. This collection is the same as the
                // created List in search(File)
		String filename = file.getName();
		if("abc.txt".equalsIgnoreCase(filename))
			results.add(file);
	}
}

Wie man sehen kann, kann man innerhalb weniger Zeilen einen DirectoryWalker schreiben, der alle Unterordner durchgeht und alle Dateien mit dem Titel “abc.txt” liefert.
Die Nutzung ist genauso simpel:

TestDirectoryWalker idw = new TestDirectoryWalker(DirectoryFileFilter.DIRECTORY, FileFilterUtils.suffixFileFilter(".txt"), 3);

		String startDir = "D:/Temp/.../blub";
		List files = null;
		try {
                        // search the directory for the wanted files
			files = idw.search(new File(startDir));
			System.out.println("Files: #" + files.size());

                        // sort the resulting files using the LastModifiedFileComparator
			System.out.println("first file: " + files.get(0));
			Collections.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);

			System.out.println("oldest file: " + files.get(0));
		} catch (IOException e) {
			e.printStackTrace();
		}

Der Konstruktor TestDirectoryWalker(IOFileFilter, IOFileFilter, int) erwartet zwei Filter, einen für die Ordner und einen für die Dateien. Die Auswahl ist umfangreich, ansonsten kann man auch seinen eigenen schreiben.

Als letztes ist vielleicht noch die Zeile

Collections.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);

interessant. LastModifiedFileComparator ist wie der Name schon andeutet, eine Klasse welches Comparator implementiert bzgl. File.lastModified(). Die Liste mit den gefundenen Dateien wird aufsteigend sortiert.

Innerhalb weniger Minuten kann man verschiedene Ordner nach speziellen Dateien suchen. Dank Apache Commons IO.

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • MisterWong
  • Technorati
  • Yigg
No Comments

Leave A Comment

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS