Nick - it's only about 40 lines of code to do this in C# (or heck - VB.NET, which is what my client wanted it in).
Yes, I do pull all the names back (.DirDetails), check the type and if it is a directory I then enter my recursive function again.
Of course, the basic recursion is only ~40 lines of code, when you add logic which checks if it matches a string pattern, things begin to bulk up. If I have *seen* it previously, I update some statistics, or if new I add it to my in-memory cache.
Essentially I am building a synchronization utility, whereby each "file" has a logical "name", which is only part of a physical name which includes a "date/timestamp" - then depending on various rules & heuristics, it routes any new items (same logical "name", but newer timestamps in the physical name) to one or more destinations.
Of course, there is more to it than this (or hell, I would just use rsync.) - there are "expectation schedules" (file is "expected" to be created every day between 8:00 & 10:00am, if it is NOT there, I have to write a "tattler" log entry. This is simply to help my users point the "giant finger of blame" when a file is not available on-time.