One way to do this would be to EnumerateFiles
for the directory and all it's sub-directories, and get a Distinct()
list of their directory names:
List<string> directoriesWithFiles = Directory
.EnumerateFiles(rootDir, "*", SearchOption.AllDirectories)
.Select(Path.GetDirectoryName)
.Distinct()
.ToList();
The first way I thought to do this was to use EnumerateDirectories
, and then for each directory use EnumerateFiles
to filter out directories that don't contain any files. But this turned out to be much slower than the method above:
List<string> directoriesWithFiles = Directory
.EnumerateDirectories(rootDir, "*", SearchOption.AllDirectories)
.Where(d => Directory.EnumerateFiles(d).Any())
.ToList();