commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Niall Pemberton (JIRA)" <j...@apache.org>
Subject [jira] Issue Comment Edited: (IO-172) Support directory scanning based on Ant-like include/exclude patterns
Date Fri, 30 May 2008 16:26:45 GMT

    [ https://issues.apache.org/jira/browse/IO-172?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12601190#action_12601190
] 

niallp edited comment on IO-172 at 5/30/08 9:25 AM:
-------------------------------------------------------------

> how would one search for files that match "*/.xml" but that don't match "bad/**"?

Currently, the way would be to create a DirectoryWalker implementation:

{code:java}
public class FileFinder extends DirectoryWalker {

    public FileFinder(IOFileFilter dirFilter, IOFileFilter fileFilter, int depthLimit) {
        super(dirFilter, fileFilter, depthLimit);
    }

    /** find files. */
    public List find(File startDirectory) throws IOException {
       List results = new ArrayList();
       walk(startDirectory, results);
       return results;
    }

    /** Handles a directory end by adding the File to the result set. */
    protected void handleDirectoryEnd(File directory, int depth, Collection results) {
        results.add(directory);
    }

    /** Handles a file by adding the File to the result set. */
    protected void handleFile(File file, int depth, Collection results) {
        results.add(file);
    }
}
{code}

Then you use the file filter implementations to achieve what you want:

{code:java}
        IOFileFilter dirFilter = FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("bad"));
        IOFileFilter fileFilter = FileFilterUtils.suffixFileFilter(".xml");
        FileFinder finder = new FileFinder(dirFilter, fileFilter, -1);
        List files = finder.find(new File("."));
{code}


      was (Author: niallp):
    > how would one search for files that match "*/.xml" but that don't match "bad/**"?

Currently, the way would be to create a DirectoryWalker implementation:

{code:java}
public class FileFinder extends DirectoryWalker {

    public FileFinder(IOFileFilter dirFilter, IOFileFilter fileFilter, int depthLimit) {
        super(dirFilter, fileFilter, depthLimit);
    }

    public List find(File startDirectory) {
       List results = new ArrayList();
       try {
           walk(startDirectory, results);
       } catch(IOException ex) {
           Assert.fail(ex.toString());
       }
       return results;
    }

    /** Handles a directory end by adding the File to the result set. */
    protected void handleDirectoryEnd(File directory, int depth, Collection results) {
        results.add(directory);
    }

    /** Handles a file by adding the File to the result set. */
    protected void handleFile(File file, int depth, Collection results) {
        results.add(file);
    }
}
{code}

Then you use the file filter implementations to achieve what you want:

{code:java}
        IOFileFilter dirFilter = FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("bad"));
        IOFileFilter fileFilter = FileFilterUtils.suffixFileFilter(".xml");
        FileFinder finder = new FileFinder(dirFilter, fileFilter, -1);
        List files = finder.find(new File("."));
{code}

  
> Support directory scanning based on Ant-like include/exclude patterns
> ---------------------------------------------------------------------
>
>                 Key: IO-172
>                 URL: https://issues.apache.org/jira/browse/IO-172
>             Project: Commons IO
>          Issue Type: New Feature
>          Components: Utilities
>    Affects Versions: 1.4
>            Reporter: Benjamin Bentmann
>
> While IO offers a rich set of {{IOFileFilters}} for finding files in directories, I feel
it's missing a concept similar to Ant's file sets. For example, how would one search for files
that match "**/*.xml" but that don't match "bad/**"? The sketched example would require to
exclude the directory "bad" but only if it is the first component of the path, something like
"foo/bad/bar.xml" still needs to be included.
> Given the increased flexibility of [Ant-like patterns|http://ant.apache.org/manual/dirtasks.html#patterns],
it would be cool to have something similar to Ant's [{{DirectoryScanner}}|http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/DirectoryScanner.java?view=markup]
available in Commons IO.
> Personally, I wouldn't need a full copy of the mentioned class, I believe some method
like
> {code:java}
> Collection<String> scanDirectory(File dir, Collection<String> includes, Collection<String>
excludes)
> {code}
> in {{FileUtils}} would just suffice. Some default excludes like SCM metadata files could
be provided as a public static final and unmodifiable string collection. The return value
should include path names relative to the base directory instead of absolute paths (it's easy
for the caller to resolve the files against the base directory but it's error-prone to relativize
absolute paths).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message