Merge pull request #156 from SquidDev-CC/feature/fs-find-performance

Performance improvements to fs.find
This commit is contained in:
Daniel Ratcliffe 2017-05-01 16:47:44 +01:00 committed by GitHub
commit ec7a251c09
1 changed files with 17 additions and 1 deletions

View File

@ -466,9 +466,25 @@ public synchronized String[] find( String wildPath ) throws FileSystemException
{
// Match all the files on the system
wildPath = sanitizePath( wildPath, true );
// If we don't have a wildcard at all just check the file exists
int starIndex = wildPath.indexOf( '*' );
if( starIndex == -1 )
{
return exists( wildPath ) ? new String[]{wildPath} : new String[0];
}
// Find the all non-wildcarded directories. For instance foo/bar/baz* -> foo/bar
int prevDir = wildPath.substring( 0, starIndex ).lastIndexOf( '/' );
String startDir = prevDir == -1 ? "" : wildPath.substring( 0, prevDir );
// If this isn't a directory then just abort
if( !isDir( startDir ) ) return new String[0];
// Scan as normal, starting from this directory
Pattern wildPattern = Pattern.compile( "^\\Q" + wildPath.replaceAll( "\\*", "\\\\E[^\\\\/]*\\\\Q" ) + "\\E$" );
List<String> matches = new ArrayList<String>();
findIn( "", matches, wildPattern );
findIn( startDir, matches, wildPattern );
// Return matches
String[] array = new String[ matches.size() ];