This might not be a suitable question for the groovy users, but I am using it 
in a groovy script, so thought it might solicit some useful feedback and 
alternate ideas.

In Java's NIO there are a couple of ways to walk the tree of files in order to 
return a file count.  There must be lots of ways!  I don't know  Groovy has a 
better built in method - but I could not see it.
This one should be the fastest, using concurrent processes. However, if the set 
of files changes during the count it errors.  I have no idea how to catch and 
ignore that error.
long fileCountV2(Path dir) {
    return Files.walk(dir)
                .parallel()
                .filter(p -> !p.toFile().isDirectory())
                .count();
}

This one works regardless of any file changes, and uses a Stream for low memory 
overhead.  But it could do with concurrency to speed it up, but I really cannot 
figure how to GPARS this for performance.  This script did once fail with "too 
many files open" error on Linux (and a directory with 200,000+ files).  I can't 
determine how - no files are actually opened!

long fileCount(Path dir)
{
  long i = 0
  try {
    Files.newDirectoryStream(dir).each {i++}
  } catch (e) {
    println (e)
  }
  return i
}

Merlin Beedell

Reply via email to