Vb.net 如何正确枚举选定路径中的文件?
Visual Studio 2008(vb.net) 我制作了简单的anivirus,但当我使用此代码进行完全扫描时:Vb.net 如何正确枚举选定路径中的文件?,vb.net,file-io,iteration,Vb.net,File Io,Iteration,Visual Studio 2008(vb.net) 我制作了简单的anivirus,但当我使用此代码进行完全扫描时: FolderBrowserDialog1.SelectedPath = ("C:\") 'first scan:************************************ Try For Each strDir As String In System.IO.Directory.GetDirectories(Fold
FolderBrowserDialog1.SelectedPath = ("C:\")
'first scan:************************************
Try
For Each strDir As String In
System.IO.Directory.GetDirectories(FolderBrowserDialog1.SelectedPath)
For Each strFile As String In System.IO.Directory.GetFiles(strDir)
ListBox1.Items.Add(strFile)
Next
Next
'Start the timer:
Catch ex As Exception
End Try
Timer1.Start()`
只需扫描前6个文件。。。
我认为问题来自Windows文件夹权限(Windows-程序文件…等)
那么如何修复它呢?您可以尝试以下方法:
For Each strFile As String In System.IO.Directory.GetFiles(strDir, "*", IO.SearchOption.AllDirectories)
编辑:
您可以尝试在此线程中找到的最后一个解决方案:
我自己试过,速度非常慢,但效果很好
Public Class Form1
Private Sub foo(ByVal aDir As String)
Try
Dim di As New IO.DirectoryInfo(aDir)
Dim aryFiles() As IO.FileInfo = di.GetFiles("*.*")
Dim aryDirs() As IO.DirectoryInfo = di.GetDirectories()
For Each fi As IO.FileInfo In aryFiles
rslts.Add(fi.FullName)
Next
For Each d As IO.DirectoryInfo In aryDirs
foo(d.FullName)
Next
Catch ex As Exception
'Stop 'the catch should be more specific
End Try
End Sub
Dim rslts As List(Of String)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
rslts = New List(Of String)
foo("C:\")
ListBox1.Items.Clear()
ListBox1.Items.AddRange(rslts.ToArray)
End Sub
End Class
看起来您的解决方案基本上是在它能找到的第一个文件夹中循环,然后停在那里。此解决方案有点不同,因为它将根据开始位置递归遍历所有文件和文件夹。您可以尝试以下操作:
For Each strFile As String In System.IO.Directory.GetFiles(strDir, "*", IO.SearchOption.AllDirectories)
编辑:
您可以尝试在此线程中找到的最后一个解决方案:
我自己试过,速度非常慢,但效果很好
Public Class Form1
Private Sub foo(ByVal aDir As String)
Try
Dim di As New IO.DirectoryInfo(aDir)
Dim aryFiles() As IO.FileInfo = di.GetFiles("*.*")
Dim aryDirs() As IO.DirectoryInfo = di.GetDirectories()
For Each fi As IO.FileInfo In aryFiles
rslts.Add(fi.FullName)
Next
For Each d As IO.DirectoryInfo In aryDirs
foo(d.FullName)
Next
Catch ex As Exception
'Stop 'the catch should be more specific
End Try
End Sub
Dim rslts As List(Of String)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
rslts = New List(Of String)
foo("C:\")
ListBox1.Items.Clear()
ListBox1.Items.AddRange(rslts.ToArray)
End Sub
End Class
看起来您的解决方案基本上是在它能找到的第一个文件夹中循环,然后停在那里。此解决方案有点不同,因为它将根据开始位置递归地遍历所有文件和文件夹。在catch块中放置一个
控制台。WriteLine(ex)
,以便可以看到抛出的任何异常。那时你可能会发现你的问题。最可能的权限。在catch块中放置一个控制台。WriteLine(ex)
,以便查看抛出的任何异常。那时你可能会发现你的问题。最有可能的权限。添加新行或替换此行:System.IO.Directory.GetDirectory(FolderBrowserDialog1.SelectedPath)仍然未修复,未扫描此文件夹(Windows、程序文件等)。您可能可以让它在单独的线程上逐步处理此问题,以使UI更具响应性,但我已经多年没有使用VB了,所以我不知道该怎么做。添加新行或替换这一行:System.IO.Directory.GetDirectory(FolderBrowserDialog1.SelectedPath)仍然没有修复,没有扫描这些文件夹(Windows、程序文件等)你可能会让它在一个单独的线程上逐步处理这个问题,以使UI更具响应性,但我已经多年没有使用VB了,所以我不知道如何处理它。仍然不工作:Catch ex作为异常控制台。WriteLine(ex)End Try控制台。WriteLine
可能不是正确的做法,特别是如果它不是一个控制台应用程序,但是您需要做一些事情来查看您遇到了哪些异常(如果有)。即使注释掉也可以尝试。。。Catch
有助于调试,但您永远不应该只是吞下异常。仍然不工作:Catch ex作为异常控制台。WriteLine(ex)End Try控制台。WriteLine
可能不是正确的做法,特别是如果它不是控制台应用程序,但是你需要做点什么来看看你遇到了什么异常,如果有的话。即使注释掉也可以尝试。。。Catch
将有助于调试,但您永远不应该只接受异常。