【问题标题】:List all file in all sub directorys regardless of how many列出所有子目录中的所有文件,不管有多少
【发布时间】:2015-07-22 07:05:20
【问题描述】:

我有以下代码来尝试获取父目录及其所有子目录中的所有文件名。

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

我该怎么做?

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

【问题讨论】:

  • 如果你想使用这样的代码,那么你需要编写一个递归方法。如果您正在搜索一个不包含任何无法访问的子文件夹的文件夹,只需使用Directory.GetFiles 的重载,它也允许您指定搜索子文件夹。就一行代码。
  • @jmcilhinney 其实你不需要递归方法...我也这么认为,但我做了一些研究,发现了下面的解决方案,只需2行代码即可实现。
  • 您通常会将该目录添加到您的参数列表中,但 .NET 有一个内置方法,您可以将其链接起来,为您枚举所有子目录。
  • @XavierPeña,就像您甚至没有阅读我的评论一样。我说如果你想使用这样的代码,你需要使用递归方法,即一次检查一个文件夹的循环。我接着说,您可以通过调用Directory.GetFiles 来在一行中完成。

标签: vb.net getfiles getdirectories


【解决方案1】:

以下代码只需两行即可完成您想要的操作:

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

[ Credit do @Carsten in this post,它列出了子目录,我更改为列出文件并将其绑定到 ListBox 元素。我不知道递归解决方案已经在 System.IO 中实现了]

Edit1:接受评论建议。

Edit2: GetFiles 不允许解决此问题:当您尝试读取时,可以配置为使当前用户无法访问它们。更多细节(以及递归函数的解决方案)here.

【讨论】:

  • 这个解决方案有两个问题。首先,你为什么要调用EnumerateFiles,然后在结果上调用ToListEnumerateFiles 的全部意义在于它返回一个可枚举的列表,以便您可以通过在检索项目时使用它们来保持较低的资源利用率。通过调用ToList 可以撤消它,那么为什么不直接调用GetFiles,它首先会返回一个数组?
  • 好点,谢谢。我要编辑它。第二个问题是什么?
  • 第二个问题是,就像GetFiles 一样,EnumerateFiles 在遇到无法访问的文件夹时会失败并抛出异常。如果您的根文件夹不包含无法访问的子文件夹,这不是问题,但如果您将 C: 驱动器根文件夹指定为起点,那么您将被搞砸。在这种情况下,您确实需要使用递归方法,因为您可以单独处理每个子文件夹,忽略不可访问的子文件夹并继续。
  • 我明白了。我没有意识到这一点,当我测试解决方案时,我使用了一些没有该问题的文件夹。编辑解决方案以确认此问题。感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2013-11-13
  • 2019-04-04
  • 2014-10-10
相关资源
最近更新 更多