Search code examples
c#list

Get number of subfolder count (Only Top Level)


I have a text file with Folder Paths which looks like this

Folder1
Folder1/SubFolder1
Folder1/SubFolder1/SubSubFolder1
Folder1/SubFolder1/SubSubFolder2
Folder1/SubFolder1/SubSubFolder3
Folder1/SubFolder1/SubSubFolder4
Folder1/SubFolder2
Folder1/SubFolder2/SubSubFolder1
Folder1/SubFolder2/SubSubFolder2
Folder1/SubFolder2/SubSubFolder3
Folder1/SubFolder2/SubSubFolder4
Folder1/SubFolder2/SubSubFolder5
Folder1/SubFolder2/SubSubFolder6
Folder1/SubFolder2/SubSubFolder6/SubSubSubFolder1
Folder1/SubFolder3
Folder2
Folder2/SubFolder1
Folder2/SubFolder1/SubSubFolder1
Folder2/SubFolder1/SubSubFolder2
Folder2/SubFolder1/SubSubFolder3
Folder2/SubFolder1/SubSubFolder4
Folder2/SubFolder2
Folder2/SubFolder2/SubSubFolder1
Folder2/SubFolder2/SubSubFolder2
Folder2/SubFolder2/SubSubFolder3
Folder2/SubFolder2/SubSubFolder4
Folder2/SubFolder2/SubSubFolder5
Folder2/SubFolder2/SubSubFolder6
Folder2/SubFolder2/SubSubFolder7
Folder2/SubFolder2/SubSubFolder6/SubSubSubFolder1
Folder2/SubFolder3
Folder2/SubFolder4

Now What I want is a dictionary of string and int which saves folder name and count number of files/folder in it (only Top Level)

Folder1, 3                  // SubFolder1, SubFolder2, SubFolder3
Folder1/SubFolder1,4            // SubSubFolder1, SubSubFolder2, SubSubFolder3, 
Folder1/SubFolder2,6       //SubSubFolder1, SubSubFolder2, SubSubFolder3, SubSubFolder4, SubSubFolder5, SubSubFolder6
Folder1/SubFolder2/SubSubFolder6,1         //SubSubSubFolder1
Folder1/SubFolder3,0
Folder2,4                // SubFolder1, SubFolder2, SubFolder3, SubFolder4
Folder2/SubFolder1,4        // SubSubFolder1, SubSubFolder2, SubSubFolder3, SubSubFolder4
Folder2/SubFolder2,7       // SubSubFolder1, SubSubFolder2, SubSubFolder3, SubSubFolder4, SubSubFolder5, SubSubFolder6, SubSubFolder7
Folder2/SubFolder2/SubSubFolder6,1             //SubSubSubFolder1
Folder2/SubFolder3,0  
Folder2/SubFolder4,0 

I can iterate it over all lines , but I guess it will get a bit complicated and messy

 var allLines = File.ReadAllLines(filePath);
 foreach (var line in allLines)
 {
    var subFolderCount = 0;
    var subFolderPath = Path.Combine(folderPath, line);
   //...
 }

but I was wondering is there any easier and efficient way to do this?


Solution

  • So as commented you just want to analyze the file content, not the actual folders in your OS, then this should work as expected:

    public static Dictionary<string, int> GetTopLevelFolderCount(IList<string> lines)
    {
        return lines
            .GroupBy(l => l)
            .ToDictionary(
                g => g.Key,
                g => lines.Count(l => l.StartsWith(g.Key, StringComparison.OrdinalIgnoreCase)
                                      && l[g.Key.Length..].Count(c => c == '/') == 1));
    }
    

    Edit: here's a demo: https://dotnetfiddle.net/iitkb9