path matching problem

Charles Hixson charleshixsn at earthlink.net
Tue Nov 27 16:04:46 PST 2012


On 11/27/2012 01:34 PM, jerro wrote:
> On Tuesday, 27 November 2012 at 19:40:56 UTC, Charles Hixson wrote:
>> Is there a better way to do this? (I want to find files that match any
>> of some extensions and don't match any of several other strings, or
>> are not in some directories.):
>>
>> import std.file;
>>
>> ...
>>
>> string exts = "*.{txt,utf8,utf-8,TXT,UTF8,UTF-8}";
>> string[] exclude = ["/template/", "biblio.txt", "categories.txt",
>> "subjects.txt", "/toCDROM/"]
>>
>> int limit = 1
>> // Iterate a directory in depth
>> foreach (string name; dirEntries(sDir, exts, SpanMode.depth))
>> { bool excl = false;
>> foreach (string part; exclude)
>> { if (part in name)
>> { excl = true;
>> break;
>> }
>> }
>> if (excl) break;
>> etc.
>
> You could replace the inner loop with somehting like:
>
> bool excl = exclude.any!(part => name.canFind(part));
>
> There may be even some easier way to do it, take a look at std.algorithm.

std.algorithm seems to generally be running the match in the opposite 
direction, if I'm understanding it properly.  (Dealing with D template 
is always confusing to me.)  OTOH, I couldn't find the string any 
method, so I'm not really sure what you're proposing, though it does 
look attractive.

Still, though your basic approach sounds good, the suggestion of Joshua 
Niehus would let me filter out the strings that didn't fit before 
entering the loop.  There's probably no real advantage to doing it that 
way, but it does seem more elegant.  (You were right, though.  That is 
in std.algorithms.)


More information about the Digitalmars-d-learn mailing list