【问题标题】:VB.NET What is the best way to get files from directories and sub directoriesVB.NET 从目录和子目录中获取文件的最佳方法是什么
【发布时间】:2018-08-08 10:50:51
【问题描述】:

我一直想知道从 vb.net 的目录和子目录中获取文件的最快和最有效的方法是什么? 我试过这些:

方法一

Private Sub getallfiles(filelocation As String)

        Try
            For Each item As String In My.Computer.FileSystem.GetFiles(filelocation)
                    Me.Invoke(Sub() ListBox1.Items.Add(item))
                    Me.Invoke(Sub() ListBox1.SelectedIndex = ListBox1.Items.Count - 1)
            Next
            For Each folder As String In My.Computer.FileSystem.GetDirectories(filelocation)
                Me.Invoke(Sub() getallfiles(folder))
            Next
        Catch ex As Exception
        End Try
    End Sub

方法二

Dim FilesFromDir() As String = Directory.GetFiles("C:\Users\user\Documents\TextNotes", "*.txt", SearchOption.AllDirectories)
ListBox3.Items.AddRange(FilesFromDir)

【问题讨论】:

  • 那你应该做一些研究。这个网站是关于回答你编写的代码中特定问题的问题。您还没有遇到任何问题,所以现在在这里提问还为时过早。如果你的问题听起来像“我不知道 X”,那么这意味着你需要研究 X。这里的问题应该是“我正在尝试做 X,这就是我尝试的方式,但它做了 Y 而不是 X "。
  • 你现在尝试了什么?
  • GetFiles 的递归变体有什么问题? (顺便说一句。还有另一种获取文件的方法:IO.Directory.EnumerateFiles 命令 En msdn.microsoft.com/de-de/library/…
  • 该方法与 getfiles。如果文件是系统文件或受保护,将停止。并停止获取所有文件的过程
  • 我认为您的问题可能更适合Code Review

标签: vb.net directory subdirectory


【解决方案1】:

不是在每次迭代时都点击 ListBox,而是将项目添加到列表中。然后调用 .BeginUpdate 和 .EndUpdate 使列表框只需重绘一次。

Private Sub getallfiles(filelocation As String)
        Dim lstFiles As New List(Of String)
        Try
            For Each item As String In My.Computer.FileSystem.GetFiles(filelocation)
                lstFiles.Add(item)
            Next
            For Each folder As String In My.Computer.FileSystem.GetDirectories(filelocation)
                getallfiles(folder)
            Next
        Catch ex As Exception
        End Try
        Me.Invoke(Sub()
          ListBox1.BeginUpdate()
          ListBox1.Items.AddRange(lstFiles.ToArray)
          ListBox1.EndUpdate()
      End Sub)
End Sub

【讨论】:

  • 作为记录,您可以使用多行 lambda 表达式将三个 Me.Invoke 调用合二为一(节省额外的执行时间),如下所示:pastebin.com/3EDRYisS -- 另外,您不应该在getallfiles(folder) 上致电Me.Invoke。这样做会将循环移动到 UI 线程,冻结整个 UI。
  • @VisualVincent 感谢您的更正。我不熟悉线程,只是遵循 OP 的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2013-11-28
  • 2021-07-06
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多