// =========================================================================== // CONTENT : CLASS FileWalker // AUTHOR : Manfred Duchrow // VERSION : 1.2 - 04/07/2003 // HISTORY : // 21/01/2000 duma CREATED // 14/02/2003 duma added -> Support for patterns with wildcards for digits // 04/07/2003 duma bugfix -> NullPointerException in walkThrough for protected directories // // Copyright (c) 2000-2003, by Manfred Duchrow. All rights reserved. // =========================================================================== package org.pf.file; // =========================================================================== // IMPORTS // =========================================================================== import java.io.File; import java.io.FilenameFilter; import org.pf.text.StringUtil; /** * This class provides services to navigate through a file directory and * handle files that match a name filter. * * @author Manfred Duchrow * @version 1.2 */ public class FileWalker { // ========================================================================= // CONSTANTS // ========================================================================= /** * The character to be used to separate filename patterns (';'). */ public static final char PATTERN_SEPARATOR_CHAR = ';' ; /** * The character to be used to separate filename patterns (';') as String. */ public static final String PATTERN_SEPARATOR = ";" ; // ========================================================================= // INSTANCE VARIABLES // ========================================================================= private FileHandler fileHandler = null ; protected FileHandler getFileHandler() { return fileHandler ; } protected void setFileHandler( FileHandler newValue ) { fileHandler = newValue ; } private boolean goOn = true ; protected boolean getGoOn() { return goOn ; } protected void setGoOn( boolean newValue ) { goOn = newValue ; } private Character digitWildcard = null ; protected Character getDigitWildcard() { return digitWildcard ; } protected void setDigitWildcard( Character newValue ) { digitWildcard = newValue ; } // ========================================================================= // CLASS METHODS // ========================================================================= // ========================================================================= // CONSTRUCTORS // ========================================================================= /** * Initialize the new instance with default values. */ public FileWalker( FileHandler handler ) { this.setFileHandler( handler ) ; } // FileWalker() // ------------------------------------------------------------------------- /** * Initialize the new instance with a file handler and a wildcard character * for digits. * * @param handler The file handler that gets all found files * @param digitWildcard A character that is used as wildcard for digits in filname patterns */ public FileWalker( FileHandler handler, char digitWildcard ) { this( handler ) ; this.setDigitWildcardChar( digitWildcard ) ; } // FileWalker() // ------------------------------------------------------------------------- // ========================================================================= // PUBLIC INSTANCE METHODS // ========================================================================= /** * This method starts in the given directory to search for all files * matching the given pattern(s). <br> * There can be more than one pattern in the pattern parameter. They have * to be separated by the PATTERN_SEPARATOR (';'). <p> * If recursive is <b>true</b> it goes down to each subdirectory and doing * the same there.<br> * For each matching file (non-directory) the defined <i>FileHandler.handle()</i> * is called. * * @param dir The directory where to start * @param pattern The file name pattern(s) for filtering out the correct files ( wildcards '*' and '?' ) * @param recursive If set to true, the file selection is going down to all subdirectories * @return the number of found files, that have matched the given pattern. */ public long walkThrough( String dir, String pattern, boolean recursive ) { ExtendedFileFilter filter = null ; String[] patterns = null ; String strPattern ; this.setGoOn( true ) ; filter = new ExtendedFileFilter() ; patterns = this.extractPatterns( pattern ) ; for (int i = 0; i < patterns.length; i++) { strPattern = patterns[i] ; if ( this.hasDigitWildcard() ) { filter.addPattern( strPattern, true, this.getDigitWildcardChar() ) ; } else { filter.addPattern( strPattern, true ) ; } } if ( recursive ) filter.alwaysIncludeDirectories() ; else filter.alwaysExcludeDirectories() ; return this.walkThrough( dir, filter, recursive ) ; } // walkThrough() // ------------------------------------------------------------------------- /** * Sets the given character as a wildcard character to match * digits ('0'-'9') only. <br> * * @param digitWildcard The placeholder character for digits */ public void setDigitWildcardChar( char digitWildcard ) { if ( digitWildcard <= 0 ) { this.setDigitWildcard( null ) ; } else { this.setDigitWildcard( new Character( digitWildcard ) ) ; } } // setDigitWildcardChar() // ------------------------------------------------------------------------- // ========================================================================= // PROTECTED INSTANCE METHODS // ========================================================================= protected long walkThrough( String dir, FilenameFilter filter, boolean recursive ) { long counter = 0 ; File directory = null ; File file = null ; File[] files = null ; int index = 0 ; directory = new File( dir ) ; files = directory.listFiles( filter ) ; if ( files == null ) // BUGFIX suggested by Kyle Gossman return counter ; this.setGoOn( this.getFileHandler().directoryStart( directory, files.length ) ) ; if ( ! this.getGoOn() ) return counter ; for ( index = 0 ; index < files.length ; index++ ) { file = files[index] ; if ( file.isDirectory() ) { if ( recursive ) { counter += this.walkThrough( file.getPath(), filter, recursive ) ; } } else { this.setGoOn( this.getFileHandler().handleFile( file ) ) ; counter++ ; } if ( ! this.getGoOn() ) break ; } // for this.setGoOn( this.getFileHandler().directoryEnd( directory ) ) ; return counter ; } // walkThrough() // ------------------------------------------------------------------------- protected String[] extractPatterns( String pattern ) { return StringUtil.current().parts( pattern, PATTERN_SEPARATOR ) ; } // extractPatterns() // ------------------------------------------------------------------------- protected char getDigitWildcardChar() { if ( this.hasDigitWildcard() ) return this.getDigitWildcard().charValue() ; else return '\0' ; } // getDigitWildcardChar() // ------------------------------------------------------------------------- protected boolean hasDigitWildcard() { return this.getDigitWildcard() != null ; } // hasDigitWildcard() // ------------------------------------------------------------------------- } // class FileWalker