Vb.net 枚举所有文件(包括子文件夹)的快速方法

Vb.net 枚举所有文件(包括子文件夹)的快速方法,vb.net,winforms,.net-3.5,file,enumeration,Vb.net,Winforms,.net 3.5,File,Enumeration,有人知道通过目录和子文件夹进行枚举以收集枚举中的所有文件的更快方法吗?这就是我现在拥有的: Public Shared allFiles() As String allFiles = Directory.GetFiles(<ServerLocation>, "*.*", SearchOption.AllDirectories) Public Shared allFiles()作为字符串 allFiles=Directory.GetFiles(,“***”,SearchOption.

有人知道通过目录和子文件夹进行枚举以收集枚举中的所有文件的更快方法吗?这就是我现在拥有的:

Public Shared allFiles() As String
allFiles = Directory.GetFiles(<ServerLocation>, "*.*", SearchOption.AllDirectories)
Public Shared allFiles()作为字符串
allFiles=Directory.GetFiles(,“***”,SearchOption.AllDirectories)
谢谢! JFV

编辑:我正在从服务器位置枚举这些文件。我不知道这是否会改变这个问题的观点。感谢到目前为止的所有投入

简短回答:

如果此代码在功能上适用于您的项目,并且您还没有用探查器证明这是一个问题,那么不要更改它。继续使用功能正确的解决方案,直到证明其速度较慢

长答覆:

这段特定代码的速度或速度取决于许多因素。其中许多取决于您运行的特定机器(例如硬盘驱动器速度)。看一看涉及文件系统的代码,很难确定地说“x比y快”

在这种情况下,我只能真正评论一件事。此方法的返回类型是FileInfo值的数组。阵列需要连续内存,而非常大的阵列可能会导致堆中出现碎片问题。如果您正在阅读的目录非常大,可能会导致堆碎片化,并间接导致性能问题

如果这是一个问题,那么您可以将PInvoke输入FindFirstFile/FindNext文件,并一次获取一个。结果可能会在CPU周期的功能上变慢,但内存压力会更小


但我必须强调,在解决这些问题之前,你应该证明它们是问题

这是一种粗鲁的做法

dir /s /b
将其输出到文本文件中,读取并按
\r\n

在特定目录中运行上述命令,查看是否有帮助

只获取目录

dir /s /b /ad
只获取文件

dir /s /b /a-d

编辑:Jared说得对,除非你的方法被证明很慢,否则不要使用其他方法。

使用System.Collections.Generic

private static List<string> GetFilesRecursive(string b)
{

             // 1.
            // Store results in the file results list.
            List<string> result = new List<string>();

            // 2.
            // Store a stack of our directories.
            Stack<string> stack = new Stack<string>();

            // 3.
            // Add initial directory.
            stack.Push(b);

            // 4.
            // Continue while there are directories to process
            while (stack.Count > 0)
            {
                // A.
                // Get top directory
                string dir = stack.Pop();

                try
                {
                    // B
                    // Add all files at this directory to the result List.
                    result.AddRange(Directory.GetFiles(dir, "*.*"));

                    // C
                    // Add all directories at this directory.
                    foreach (string dn in Directory.GetDirectories(dir))
                    {
                        stack.Push(dn);
                    }
                }
                catch
                {
                    // D
                    // Could not open the directory
                }
            }
            return result;
        }
私有静态列表GetFilesRecursive(字符串b)
{
// 1.
//将结果存储在“文件结果”列表中。
列表结果=新列表();
// 2.
//存储我们的目录堆栈。
堆栈=新堆栈();
// 3.
//添加初始目录。
堆栈推送(b);
// 4.
//在有目录要处理时继续
而(stack.Count>0)
{
//A。
//获取顶级目录
string dir=stack.Pop();
尝试
{
//B
//将此目录中的所有文件添加到结果列表中。
result.AddRange(Directory.GetFiles(dir,“*”);
//C
//在此目录中添加所有目录。
foreach(Directory.GetDirectories(dir)中的字符串dn)
{
堆栈推送(dn);
}
}
抓住
{
//D
//无法打开目录
}
}
返回结果;
}

原始文章的道具:

这是我的解决方案。最初的启动有点慢,我正在努力。my.computer.filesystem对象可能是启动缓慢的问题。但这种方法将在5分钟内通过网络列出31000个文件

Imports System.Threading

Public Class ThreadWork

Public Shared Sub DoWork()
    Dim i As Integer = 1
    For Each File As String In My.Computer.FileSystem.GetFiles("\\172.16.1.66\usr2\syscon\S4_650\production\base_prog", FileIO.SearchOption.SearchTopLevelOnly, "*.S4")
        Console.WriteLine(i & ". " & File)
        i += 1
    Next
End Sub 'DoWork
End Class 'ThreadWork

Module Module1

Sub Main()
    Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
    Dim myThread As New Thread(myThreadDelegate)
    myThread.Start()
    '"Pause" the console to read the data.
    Console.ReadLine()
End Sub 'Main

End Module

但与此同时,任何试图用.NET列出大目录中所有文件的人都会知道这是一个性能问题。列出1000个文件夹名称,仅仅是文件夹名称,可能需要花费几乎一整秒钟的时间。请您澄清一下,为什么您认为调用dir并读取输出会比调用Directory.GetFiles更快?