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();