The link you provided is the most efficient way in C# (with .Net 4.0):
Directory.EnumerateFiles Method
Prior versions of .Net had to use a slower method that caused memory issues on large drives, @hatchet showed a great example: Is there a faster way to scan through a directory recursively in .NET?
I wouldn't suggest using the TPL as Jon Skeet mentions here:
Task Parallel Library for directory traversal
If you see the first comment in this MSDN link: Iterate File Directories with the Parallel Class I dont even think Microsoft had success with this TPL method either.
The other suggestion I have is using LogParser and you can use it with C#! Its a free Microsoft product but I'm not sure about re-dist permissions, I had to include it in my package separately last time I used it. It full on flys, faster than a speeding train!
As per @spender comment I found a Log Parser example that finds files dated 180 days and older, you could try it out and adapt it if its useful:
SELECT
ContentPath, [Days (Old)], FileName, [Creation Date Time]
USING creationtime AS [Creation Date Time],
TO_DATE([Creation Date Time]) AS Cdate,
SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), Cdate) AS Days,
DIV(TO_INT(Days),86400) As [Days (Old)],
EXTRACT_PATH(TO_LOWERCASE(path)) AS ContentPath,
TO_LOWERCASE(name) AS FileName
FROM %source%
WHERE
(attributes NOT LIKE 'D%')
AND
([Days (Old)] >= TO_INT('%day%'))
ORDER BY [Creation Date Time] DESC
%source% could be something like c:*.exe as shown in the argument c:emp*.*. Save the above as cc.sql, run it with the following syntax:
C:TempToolsLogparser>LogParser.exe file:cc.sql?source="c:emp*.*"+day="180" -i:FS -preserveLastAccTime -rtp:-1
EDIT
Thanks for the upvotes guys! I made this Event Analyser app in 2005 (before .net 2.0 was released) and since the Log Parser suggestion was so popular I thought I'd share the way you can use LogParser in .Net
The good folks over at http://visuallogparser.codeplex.com/ have
provided us with the source code.
Open the VisualLogParser solution in VS2010, ignore the prompt about debugging, after the solution loads, F5, set the combo-box to FS (FileSystem), paste in this query and press go.
SELECT
? ? ContentPath, [Days (Old)], FileName, [Creation Date Time]
? ? USING creationtime AS [Creation Date Time],
? ? TO_DATE([Creation Date Time]) AS Cdate,
? ? SUB(TO_LOCALTIME(SYSTEM_TIMESTAMP()), Cdate) AS Days,
? ? DIV(TO_INT(Days),86400) As [Days (Old)],
? ? EXTRACT_PATH(TO_LOWERCASE(path)) AS ContentPath,
? ? TO_LOWERCASE(name) AS FileName
FROM 'c:*.exe'?
WHERE
? (attributes NOT LIKE 'D%')
AND
? ([Days (Old)] >= TO_INT('180'))
ORDER BY [Creation Date Time] DESC
At the same time you may wish run any other .Net application that searches directories and compare the results!!!