Java Code For Getting A List of Files From A FileSet
Created Sep 4, 2002
Erik Hatcher Directly from Java Development with Ant:
19.5 OPERATING ON A FILESET
Ant's datatypes make writing tasks that deal with many of the typical Java build
domain objects such as paths and filesets much simpler. If you are writing a task to
process files in a single directory tree and would like your task to act as an implicit
fileset, the base class
Using MatchingTask provides some nice freebies that mirror the <fileset> datatype:
org.apache.tools.ant.taskdefs.MatchingTask can
save a lot of work. Listing 19.4 shows a task to process a set of files.
package org.example.antbook.tasks;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.MatchingTask;
public class FileProcTask extends MatchingTask {
private File dir;
public void setDir (File dir) {
this.dir = dir;
}
public void execute() throws BuildException {
if (dir == null) {
throw new BuildException("dir must be specified");
}
log("dir = " + dir, Project.MSG_DEBUG);
DirectoryScanner ds = getDirectoryScanner(dir);
String[] files = ds.getIncludedFiles();
for (int i = 0; i < files.length; i++) {
log("file: " + files[i]);
}
dir = null;
}
}
Listing 19.4 A task to act upon an implicit fileset
Using MatchingTask provides some nice freebies that mirror the <fileset> datatype:
- includes/excludes attributes
- defaultexcludes attribute
- <include>/<exclude> / <includesfile> / <excludesfile> elements <patternset> element
setDir method and required
that a dir attribute be specified by throwing a BuildException in execute if it
was not specified. The MatchingTask base class provides a getDirectoryScanner(
File baseDir) method to get a DirectoryScanner instance, taking into
account all the specified inclusion and exclusion rules.
Although many Ant tasks are derived from MatchingTask, the current trend is
away from this task; explicit filesets have proven to be more flexible. If you are writing
your own task, the ease of using MatchingTask as a base class still makes it appealing.
Tasks that extend from MatchingTask should only deal with a single implicit fileset.
Tasks that need to support multiple nested filesets should extend from Task instead.