如何查找包含具有给定扩展名的文件的文件夹

How to find folders that contain files with a given extension

我是新手,看到 System.IO 可以提供我需要的东西,但我不知道如何做。我正在使用 VB.net

从给定的文件夹开始,例如C:\StartHere 我想递归文件夹层次结构以查找包含具有给定扩展名的文件的任何文件夹,例如*.exe。我想建立这些文件夹的列表以供后续处理。

如果有人能提供帮助,我将不胜感激,因为我不知道解决这个问题的最佳方法。

更新

以下内容应 Andrew Morton 的要求提供了更多详细信息。 从指定的文件夹开始,我想获得一个列表,其中包含所有包含 EXE 的子文件夹的完整路径。因此出现了以下文件夹…

C:\StartHere\folderA (contains some EXEs)
C:\StartHere\folderB (none in here)
C:\StartHere\Deeper\DeepC (contains some EXEs)
C:\StartHere\Deeper\DeepD (contains some EXEs)
C:\StartHere\Deeper\DeepE (none in here)
C:\StartHere\Deeper\DeepF (contains some EXEs)

该代码将产生一个包含以下内容的列表:

C:\StartHere\folderA 
C:\StartHere\Deeper\DeepC
C:\StartHere\Deeper\DeepD
C:\StartHere\Deeper\DeepF

在@Tim Schmelter、@Jimi 和@Andrew Morton 的大力帮助下,我现在的代码是这样的:

Dim folderList = Directory.EnumerateDirectories("C:\StartHere", "*", SearchOption.AllDirectories).Where(Function(d) Directory.EnumerateFiles(d, "*.exe").Any()).Select(Function(f) Path.GetDirectoryName(f))

当运行时,它创建如下列表;所以它找到了正确的文件夹,但将其父文件夹添加到列表而不是完整路径:

C:\StartHere 
C:\StartHere\Deeper
C:\StartHere\Deeper
C:\StartHere\Deeper

好吧,a method 已经满足了您的需求:

Dim exeList = IO.Directory.GetFiles("C:\StartHere", "*.exe", IO.SearchOption.AllDirectories).ToList()

编辑:我首先误解了问题,所以你想要一份包含至少一个 exe 文件的所有文件夹的列表?您可以使用此 LINQ 查询:

Dim exeDirs = From dir In IO.Directory.EnumerateDirectories("C:\StartHere", "*.*", IO.SearchOption.AllDirectories)
              Where IO.Directory.EnumerateFiles(dir).Any(Function(file) IO.Path.GetExtension(file).Equals(".exe", StringComparison.OrdinalIgnoreCase))
Dim exeDirList As List(Of String) = exeDirs.ToList()