/* * [JunkFileFilter.java] * * Summary: Filter to detect junk files. * * Copyright: (c) 2007-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 2.5 2009-02-28 CommandLine split off in its own package. * 2.6 2009-05-09 add StartAndEndWithFilter and NoFootFilter * 2.7 2010-11-22 add optional invert parameter on a number of the filters. */ package com.mindprod.filter; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; import java.util.HashSet; /** * Filter to detect junk files. *

* accept only junk files. Can define junk files by name, extension, starts with or endsWith lists. * * @author Roedy Green, Canadian Mind Products * @version 2.7 2010-11-22 add optional invert parameter on a number of the filters. * @see AvoidJunkFilter * @since 2007-08-28 */ public class JunkFileFilter implements FilenameFilter { /** * Extension to be deleted, stored in lower case. If none, this usually be null. It does not matter what is to the * left of the dot. */ private HashSet junkExtensions; /** * filenames to be deleted, in lower case. If none, this usually be null. It does not matter what is to the right of * the dot. */ private HashSet junkFilenames; /** * if a filename ends in these chars, it will be deleted. Stored in lower case. If none, this usually be null. Does * not matter what it starts with. */ private String[] junkEndsWith; /** * if a filename starts in these chars, it will be deleted. Stored in lower case. If none, this usually be null. * Does not matter what it ends with. */ private String[] junkStartsWith; /** * Defines which filenames and extensions are considered junk, to be deleted. */ public JunkFileFilter() { } /** * Accept only junk files to be deleted. * * @param dir the directory in which the file was found. * @param name the name of the file. * * @return true if and only if the name should be included in the file list; false otherwise. */ public boolean accept( File dir, String name ) { if ( dir == null || name == null || new File( dir, name ).isDirectory() ) { return false; } // do easy startsWith and endsWith first if ( junkStartsWith != null ) { for ( String sw : junkStartsWith ) { if ( name.startsWith( sw ) ) { return true; } } } if ( junkEndsWith != null ) { for ( String ew : junkEndsWith ) { if ( name.endsWith( ew ) ) { return true; } } } // split file into name and extension String filename = name; String extension = ""; int whereDot = name.lastIndexOf( '.' ); if ( 0 < whereDot && whereDot <= name.length() - 2 ) { extension = name.substring( whereDot + 1 ).toLowerCase(); } if ( junkExtensions != null && junkExtensions.contains( extension ) ) { return true; } if ( 1 < whereDot ) { filename = name.substring( 0, whereDot ).toLowerCase(); } return junkFilenames != null && junkFilenames .contains( filename ); } /** * Set the list of junk ends-with criteria. Replaces previous list, does not add to it. * * @param junkEndsWith Array of strings. If file starts this way, it considered junk. */ public void setEndsWith( String... junkEndsWith ) { this.junkEndsWith = junkEndsWith; // store in lower case for fast compare. if ( this.junkEndsWith != null ) { // cannot use for:each for ( int i = 0; i < this.junkEndsWith.length; i++ ) { this.junkEndsWith[ i ] = this.junkEndsWith[ i ].toLowerCase(); } } } /** * Set the list of just extensions. Replaces previous list, does not add to it. * * @param junkExtensions Array of strings defining unqualified, dotless filename extensions considered junk. */ public void setExtensions( String... junkExtensions ) { if ( junkFilenames != null ) { this.junkExtensions = new HashSet<>( Arrays.asList( junkExtensions ) ); } else { this.junkExtensions = null; } } /** * Set the list of junk filenames. Replaces previous list, does not add to it. * * @param junkFilenames Array of strings defining the unqualified, extensionless filenames considered junk. */ public void setFilenames( String... junkFilenames ) { if ( junkFilenames != null ) { this.junkFilenames = new HashSet<>( Arrays.asList( junkFilenames ) ); } else { this.junkFilenames = null; } } /** * Set the list of junk start * -with criteria. Replaces previous list, does not add to it. * * @param junkStartsWith Array of strings. If file starts this way, it considered junk. */ public void setStartsWith( String... junkStartsWith ) { this.junkStartsWith = junkStartsWith; // store in lower case for fast compare. if ( this.junkStartsWith != null ) { // cannot use for:each for ( int i = 0; i < this.junkStartsWith.length; i++ ) { this.junkStartsWith[ i ] = this.junkStartsWith[ i ].toLowerCase(); } } } }