Vb.net 如何使用Directory.Enumerate文件
msdn()说: EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,枚举文件可以更有效 如何在返回整个集合之前开始使用集合 下面的代码给出了一个包含45000个文件的目录的运行时间超过3分钟Vb.net 如何使用Directory.Enumerate文件,vb.net,Vb.net,msdn()说: EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,枚举文件可以更有效 如何在返回整个集合之前开始使用集合 下面的代码给出了一个包含45000个文件的目录的运行时间超过3分钟 Dim TIme1, TIme2 As String TIme1 = TimeString Dim DirFiles
Dim TIme1, TIme2 As String
TIme1 = TimeString
Dim DirFiles As Generic.List(Of String) = New Generic.List(Of String)(Directory.EnumerateFiles(SourceDirectory))
Dim NumberOfFiles As Integer
NumberOfFiles = DirFiles.Count()
TIme2 = TimeString
MsgBox("Begin time " & TIme1 & "There are " & NumberOfFiles & " Photos in the Directory ." & SourceDirectory & "End Time " & TIme2)
在完全读取集合之前,我是否可以使用Dirfiles中的条目?怎么做
在微软推出Windows之前,我曾是一名专业程序员。我的windows编程经验很少。
枚举文件
允许您在找到所有文件之前开始处理文件。似乎您想知道文件的数量。在找到所有文件之前,您无法知道这一点,因此EnumerateFiles
在这种情况下对您没有帮助。虽然您无法充分利用EnumerateFiles
返回的文件计数,您可以毫不延迟地开始使用集合中的单个文件,为每个循环使用,而不需要计算其工作所需的元素数
例如,你可以做:
Dim FileCount As Integer
Dim files = Directory.EnumerateFiles(srcDir)
For Each file in files
'Do something with this file
' e.g.
TextBox1.AppendText(file & vbCrLf)
FileCount += 1
Next
MsgBox ( FileCount.ToString & " files processed.")
你知道怎么用吗
[NB:徒手输入的代码..可能包含打字错误。这只是为了解释概念。]GetFiles方法将具体化目录中的整个文件列表。现在调用的首选方法是Directory.EnumerateFiles,因为它将流式返回文件(通过类似于收益率的机制),因为对操作系统的底层调用将返回结果
使用GetFiles/GetDirectories的解决方案有点慢,因为需要创建对象。另一方面,使用枚举并不能做到这一点,它不会创建任何临时对象
不管怎样,最终还是会有迭代发生
示例文件计数
Directory.EnumerateFiles(directory, filetype, SearchOption.AllDirectories).Count()
在开始枚举文件之前,我现在使用以下命令
Public Function FileCount(PathName As String) As Long
Dim fso As Scripting.FileSystemObject
Dim fld As Scripting.Folder
fso = CreateObject("Scripting.FileSystemObject")
If fso.FolderExists(PathName) Then
fld = fso.GetFolder(PathName)
FileCount = fld.Files.Count
End If
End Function
这需要Microsoft脚本运行时(在项目中设置对VB脚本运行时库的引用)GetFiles
的签名是目录.GetFiles(路径为字符串)为字符串()。为了让它返回结果,它必须先访问硬盘并构建整个阵列。如果有45000个文件,那么它必须先构建45000个元素的数组,然后才能给出结果
EnumerateFiles
的签名为目录。EnumerateFiles(路径为字符串)为IEnumerable(字符串的)
。在这种情况下,它根本不需要点击硬盘就可以给你一个响应。因此,无论文件的数量如何,您都应该能够立即获得结果
采用以下测试代码:
Dim sw = Stopwatch.StartNew()
Dim files = Directory.GetFiles("C:\Windows\System32")
sw.Stop()
Console.WriteLine(sw.Elapsed.TotalMilliseconds)
我得到一个大约6.5毫秒的结果来返回文件
但是如果我将GetFiles
更改为EnumerateFiles
,我将在0.07毫秒内返回结果。为此文件夹调用GetFiles
的速度要慢近100倍
这是因为EnumerateFiles
返回一个IEnumerable
。IEnumerable(Of T)
的接口是:
Public Interface IEnumerable(Of Out T)
Inherits IEnumerable
Function GetEnumerator() As IEnumerator(Of T)
End Interface
每当我们在引擎盖下的可枚举对象上调用foreach
或Count()
或ToArray()
时,我们都调用GetEnumerator()
,它反过来返回另一个类型为IEnumerator(of T)
的对象,并带有此签名:
Public Interface IEnumerator(Of Out T)
Inherits IDisposable
Inherits IEnumerator
ReadOnly Property Current As T
Function MoveNext() As Boolean
Sub Reset()
End Interface
正是这个枚举器实际完成了返回所有文件的艰巨工作。第一次调用MoveNext
后,第一个文件名立即在Current
中可用。然后在循环中调用MoveNext
,直到它返回false
,然后您就知道循环结束了。同时,您可以从Current
属性收集所有文件
因此,在您的代码中,如果您对返回的每个文件都执行一些操作,那么EnumerateFiles
将是最佳选择
但是,由于您正在执行新建Generic.List(字符串)(Directory.EnumerateFiles(SourceDirectory))
操作,因此您将立即强制迭代整个可枚举文件。使用EnumerateFiles的任何优势都会立即消失。在找到所有文件之前,您无法知道这一点,因此EnumerateFiles在这种情况下对您没有帮助。
,我认为这不是一个有效的声明,因为GetFiles是相同的,它仍然需要创建对象并遍历目录,然后才能知道计数(EnumerateFiles不这样做)。无论哪种方式,两种方法都必须在知道计数之前完成。你能解释一下吗?这些文件没用。。。但也不痛。而且它可能仍然有帮助,因为现在内存中一次只加载一个文件名,而不需要加载整个列表。@436f6465786572问题引用了MSDN,这意味着使用EnumerateFiles
可以比GetFiles
节省时间。我只是简单地指出,如果你要做的是计算文件的数量,EnumerateFiles
并不能节省时间。是的,你显然可以得到数量。但这两种方法的工作方式是不同的。这篇文章的目的就是要解释清楚。可枚举项一次只执行一项,如果调用Count方法,它们将一直执行到最后一项以获取计数。在您实际尝试获取计数之前,它可能不会将计数存储在任何位置。另一方面,一个列表/数组中已经有了所有的项,所以也已经有了计数。好的..我想我的句子很混乱。。。糟糕的英语…现在重新措辞。这不是答案。请删除。为了感谢人们,你应该投票选出他们的答案,并将其中一个标记为已接受