I am using Directory.EnumerateFiles()
to Enumerate files in my program. I am having issue while enumerating the "Application Data" folder (available at : C:\Program Data\Application Data).
The EnumerateFiles()
goes into loop as "Application Data" folder has one more shortcut with name "Application Data" in it and it has one more inside it and so on.
After few iterations, path becomes long enough and EnumerateFiles()
comes out with PathTooLongException
.
How do I avoid this loop and enumerate remaining files?
Code:
private void EnumerateRecursively(DirectoryInfo dirInfo, string searchPattern, EnumerationData data)
{
try
{
EnumerateDirectory(dirInfo, searchPattern, data, SearchOption.TopDirectoryOnly);
foreach (DirectoryInfo dir in dirInfo.EnumerateDirectories())
{
EnumerateDirectory(dir, searchPattern, data, SearchOption.AllDirectories);
}
}
catch (PathTooLongException ex)
{
WriteTrace(FormatExceptionData(ex));
}
catch (Exception ex)
{
WriteTrace(FormatExceptionData(ex));
}
}
private void EnumerateDirectory(DirectoryInfo dir, string searchPattern, EnumerationData data, SearchOption searchOption)
{
try
{
foreach (FileInfo fileInfo in dir.EnumerateFiles(searchPattern, searchOption))
{
//Do something
}
}
catch (PathTooLongException ex)
{
WriteTrace(FormatExceptionData(ex));
}
catch(UnauthorizedAccessException ex)
{
WriteTrace(FormatExceptionData(ex));
}
catch (Exception ex)
{
WriteTrace(FormatExceptionData(ex));
}
}
EDIT: As I found out, what I refer here as loop is actually called Reparse Points/Junctions. Sometimes these points' target have copy of this reparse point which leads to endless loop during enumeration.