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?
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