HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Enumerate directories to a given search depth

Submitted by: @import:stackexchange-codereview··
0
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 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 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.