列出所有子导向器中的所有文件,无论有多少

列出所有子导向器中的所有文件,无论有多少

问题描述:

我有以下代码尝试获取我的父目录及其所有子目录中的所有文件名。列出所有子导向器中的所有文件,无论有多少

该代码有效,但不是我想要的。即它将处理父目录中的所有文件,并且全部处于子目录的“第一级”中,但我希望能够进入所有级别的子目录。

我该怎么做?

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    'ListBox1.Items.AddRange(IO.Directory.GetFiles("C:\")) 

    For Each Dir As String In IO.Directory.GetDirectories("C:\Program Files") 
     ' ListBox1.Items.Add(Dir) 
     ListBox1.Items.AddRange(IO.Directory.GetFiles(Dir)) 
    Next 
End Sub 
+0

如果你想使用这样的代码,那么你需要编写一个递归方法。如果您搜索的文件夹不包含任何不可访问的子文件夹,只需使用“Directory.GetFiles”的重载,即可以指定搜索子文件夹。这是一行代码。 – jmcilhinney

+1

@jmcilhinney实际上你不需要递归方法...我也这么认为,但是我做了一些研究,发现下面的解决方案只需2行代码即可实现。 –

+0

您通常会将该目录添加到您的参数列表中,但.NET有一个内置方法,您可以通过链接来枚举所有子目录。 – ragerory

下面是代码已经做了你在短短的两行想要的东西:

Dim result As List(Of String) = System.IO.Directory.GetFiles("C:\Program Files", "*", System.IO.SearchOption.AllDirectories) 
    listBox1.DataSource = result 

[信用做@Carsten在this post,其中列出的子目录和我改上市文件,并将其绑定到ListBox元素。我不知道递归解决方案已经在System.IO中实现]

编辑1:采取评论的建议。

编辑2: GetFiles不允许针对此问题的解决方法:尝试读取时可以配置,以便当前用户可能无法访问它们。更多细节(和递归函数的解决方案)here

+1

该解决方案有两个问题。首先,你为什么要调用'EnumerateFiles',然后调用'ToList'的结果? “EnumerateFiles”的重点在于它返回一个可枚举的列表,以便在检索它们时通过使用这些项来保持资源利用率较低。通过调用'ToList'你可以撤消它,所以你为什么不直接调用'GetFiles',而是首先返回一个数组呢? – jmcilhinney

+0

好点,谢谢。我要编辑它。第二个问题是什么? –

+1

第二个问题是,就像'GetFiles'一样,如果遇到无法访问的文件夹,'EnumerateFiles'将失败并出现异常。如果您的根文件夹不包含无法访问的子文件夹,但这不是问题,但如果您要将C:驱动器根文件夹指定为起点,那么您将被拧紧。在这种情况下,您需要使用递归方法,因为您可以单独处理每个子文件夹,忽略不可访问的子文件夹并继续。 – jmcilhinney