vb.net-需要帮助快速枚举整个c驱动器上的文件吗

vb.net-需要帮助快速枚举整个c驱动器上的文件吗,vb.net,directory,enumerate,getfiles,Vb.net,Directory,Enumerate,Getfiles,我知道我的C驱动器上有350808个文件,我可以使用getfile和getdirectory函数访问这些文件,但是那样的话,递归整个驱动器大约需要3个小时。我读到使用枚举函数要快得多,但它似乎只减少了大约1300个文件,然后就退出了。 这是我的密码: Dim sw As New StreamWriter(ProjDir & "TestFour.txt", False) Try Dim dirPrograms As New DirectoryInfo(Fir

我知道我的C驱动器上有350808个文件,我可以使用getfile和getdirectory函数访问这些文件,但是那样的话,递归整个驱动器大约需要3个小时。我读到使用枚举函数要快得多,但它似乎只减少了大约1300个文件,然后就退出了。 这是我的密码:

    Dim sw As New StreamWriter(ProjDir & "TestFour.txt", False)
    Try
        Dim dirPrograms As New DirectoryInfo(FirstDir)
        Dim dirs = From dir In dirPrograms.EnumerateDirectories()
        For Each d As DirectoryInfo In dirs
            sw.WriteLine("{0}", d.FullName)
            Dim DirInfo As New DirectoryInfo(d.FullName)
            Dim files = From f In DirInfo.EnumerateFiles("*.*", SearchOption.AllDirectories)
            For Each f In files
                sw.WriteLine(f.FullName)
                fPath = f.DirectoryName
                fName = f.Name
                fSize = f.Length
                fCre = f.CreationTime
                fMod = f.LastAccessTime
                sw.WriteLine("{0}*{1}*{2}*{3}*{4}", fPath, fName, fSize, fCre, fMod)
            Next
        Next
    Catch
    End Try
    Process.Start(ProjDir & "testFour.txt")
    sw.Close()
    sw.Dispose()

为什么它会停在1300个文件上?如何修复代码以递归整个C驱动器,而不仅仅是前十个目录?

编写自己的递归方法来枚举文件,并在任务中运行此方法

Imports System.IO
Module Module1
  Sub Main()
    Dim searcher As New Task(Of IList(Of String))(Function()
                                                    Return GetFiles("C:\", "*.txt")
                                                  End Function)
    searcher.Start()
    Console.WriteLine("Searching for .txt files in C:\ and all subdirectories...")
    searcher.Wait()
    Dim files = searcher.Result
    Console.WriteLine(String.Format("{0:N0} .txt files found.", files.Count))
    Console.ReadKey()
  End Sub
  Function GetFiles(directoryPath As String, filter As String) As IList(Of String)
    Dim files As New List(Of String)
    Dim directories() As String = Nothing
    Try
      files.AddRange(Directory.GetFiles(directoryPath, filter))
      directories = Directory.GetDirectories(directoryPath)
    Catch ex As Exception
      Console.WriteLine($"Error while processing folder {directoryPath}.")
    End Try
    If directories IsNot Nothing Then
      For Each directory In directories
        files.AddRange(GetFiles(directory, filter))
      Next
    End If
    Return files
  End Function
End Module

不要使用
所有目录
,而是手动浏览目录树。然后,您可以在
中为每个
捕获可能的IO例外。如果不写入流,速度有多快?如果搜索所有文件,枚举函数不会快很多。它们的主要优点是可以在搜索完整目录之前退出,但是如果你想通读到最后,那就没有什么大的优势了。我希望它们对内存管理的影响较小,因此您可能会看到性能略有提高,但显然磁盘访问是造成这种情况的罪魁祸首,而不是内存使用。如果您想知道代码为什么不处理所有文件,请去掉Try/Catch(或者在Catch块中做一些有用的事情)。很可能是权限问题。