prune with dirEntries

Dan dbdavidson at yahoo.com
Fri Nov 30 04:02:50 PST 2012


On Friday, 30 November 2012 at 07:29:59 UTC, Joshua Niehus wrote:
> On Friday, 30 November 2012 at 06:29:01 UTC, Joshua Niehus 
> wrote:
>> I think if you go breadth first, you can filter out the 
>> unwanted directories before it delves into them
>
Good idea, thanks. I could not get original to compile as is - 
but the concept is just what was needed. I got an error on line 8:
Error: not a property dirEntries(path, cast(SpanMode)0, 
true).filter!(__lambda2)
I'm using a quite recent version of dmd and phobos.

But, I pulled the lamda out into a function and it works great. I 
assume the parallel is for performance, and it actually runs 
significantly slower than without on my test case - but no work 
is being done other than build the list of files, so that is 
probably normal. For my case the breakdown is:

No Pruning: 11 sec
Pruning Parallel: 4.78 sec
Pruning Serial: 0.377 sec

Thanks
Dan

---------------------
import std.algorithm, std.regex, std.stdio, std.file;
import std.parallelism;

bool interested(DirEntry path) {
   static auto exclude = regex(r"\.git|\.DS_Store", "g");
   return match(path.name, exclude).empty;
}

DirEntry[] prune(string path, ref DirEntry[] files)
{
   static if(0) {
     foreach(_path; 
taskPool.parallel(filter!interested(dirEntries(path, 
SpanMode.shallow))))  {
       files ~= _path;
       if (isDir(_path.name)) { prune(_path.name, files); }
     }
   } else {
     foreach(_path; filter!(interested)(dirEntries(path, 
SpanMode.shallow)))  {
       files ~= _path;
       if (isDir(_path.name)) { prune(_path.name, files); }
     }
   }
   return files;
}

void main()
{
   DirEntry[] files;
   prune("/path", files);
   //  foreach(file;files) { writeln(file.name); }
}


More information about the Digitalmars-d-learn mailing list