patterncsharpMinor
Enumerate directories to a given search depth
Viewed 0 times
depthsearchgivenenumeratedirectories
Problem
Since I had been in the need of finding directories from a startpath with different search depth levels, I created this little helper class.
This class is using objects of the
```
public class IOHelper
{
public const int AllDirectories = -1;
public const int TopDirectoryOnly = 0;
private const char WildCard = '*';
public static IEnumerable EnumerateDirectories(String startDirectory, int depth)
{
return EnumerateDirectories(startDirectory, ".", depth);
}
public static IEnumerable EnumerateDirectories(String startDirectory, String searchPattern, int depth)
{
if (depth EnumerateDirectoriesInDepth(String startDirectory, String searchPattern, int depth)
{
IEnumerable directories = EnumerateDirectoriesInDepth(startDirectory, depth);
Boolean isWildCardSearch = searchPattern.Contains(WildCard);
if (!isWildCardSearch)
{
searchPattern = String.Concat("\\", searchPattern);
return directories.Where(d => d.EndsWith(searchPattern));
}
IEnumerable enumeratedDirectories = Enumerable.Empty();
foreach (String directory in directories)
{
enumeratedDirectories = enumeratedDirectories.Concat(Directory.EnumerateDirectories(directory, searchPattern));
}
return enumeratedDirectories;
}
private static IEnumerable EnumerateDirectoriesInDepth(String startDirectory, int depth)
{
if (depth (); }
IEnumerable directories = Directory.EnumerateDirectories(startDirectory, ".", SearchOption.TopDirectoryOnly);
if (!directories.Any()) { return directories; }
depth = depth - 1;
IEnumerable subDirectories = Enumerable.Empty();
foreach (String directory in directories)
{
subDirectories = subDirectories.Concat(EnumerateDirectoriesInDepth(directory, depth));
}
return directories.Concat(subDirectories);
This class is using objects of the
System.IO namespace.```
public class IOHelper
{
public const int AllDirectories = -1;
public const int TopDirectoryOnly = 0;
private const char WildCard = '*';
public static IEnumerable EnumerateDirectories(String startDirectory, int depth)
{
return EnumerateDirectories(startDirectory, ".", depth);
}
public static IEnumerable EnumerateDirectories(String startDirectory, String searchPattern, int depth)
{
if (depth EnumerateDirectoriesInDepth(String startDirectory, String searchPattern, int depth)
{
IEnumerable directories = EnumerateDirectoriesInDepth(startDirectory, depth);
Boolean isWildCardSearch = searchPattern.Contains(WildCard);
if (!isWildCardSearch)
{
searchPattern = String.Concat("\\", searchPattern);
return directories.Where(d => d.EndsWith(searchPattern));
}
IEnumerable enumeratedDirectories = Enumerable.Empty();
foreach (String directory in directories)
{
enumeratedDirectories = enumeratedDirectories.Concat(Directory.EnumerateDirectories(directory, searchPattern));
}
return enumeratedDirectories;
}
private static IEnumerable EnumerateDirectoriesInDepth(String startDirectory, int depth)
{
if (depth (); }
IEnumerable directories = Directory.EnumerateDirectories(startDirectory, ".", SearchOption.TopDirectoryOnly);
if (!directories.Any()) { return directories; }
depth = depth - 1;
IEnumerable subDirectories = Enumerable.Empty();
foreach (String directory in directories)
{
subDirectories = subDirectories.Concat(EnumerateDirectoriesInDepth(directory, depth));
}
return directories.Concat(subDirectories);
Solution
Since the class has only static and constant members, you should make the entire class static. It eliminates the unnecessary empty instance constructor the framework automatically generates. (see code analysis rules CA1052 and CA1053).
You should also generally use the type aliases provided (i.e., string instead of String, bool instead of Boolean, etc. - see StyleCop rule SA1121).
Additionally, I would change the recursion in
You should also generally use the type aliases provided (i.e., string instead of String, bool instead of Boolean, etc. - see StyleCop rule SA1121).
Additionally, I would change the recursion in
EnumerateDirectoriesInDepth so it does not have to recurse another step when the depth is zero.private static IEnumerable EnumerateDirectoriesInDepth(string startDirectory, int depth)
{
var directories = Directory.EnumerateDirectories(startDirectory, "*.*", SearchOption.TopDirectoryOnly);
if (depth == TopDirectoryOnly || !directories.Any())
{
return directories;
}Code Snippets
private static IEnumerable<string> EnumerateDirectoriesInDepth(string startDirectory, int depth)
{
var directories = Directory.EnumerateDirectories(startDirectory, "*.*", SearchOption.TopDirectoryOnly);
if (depth == TopDirectoryOnly || !directories.Any())
{
return directories;
}Context
StackExchange Code Review Q#70520, answer score: 4
Revisions (0)
No revisions yet.