Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何使用Directory.Enumerate文件_Vb.net - Fatal编程技术网

Vb.net 如何使用Directory.Enumerate文件

Vb.net 如何使用Directory.Enumerate文件,vb.net,Vb.net,msdn()说: EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,枚举文件可以更有效 如何在返回整个集合之前开始使用集合 下面的代码给出了一个包含45000个文件的目录的运行时间超过3分钟 Dim TIme1, TIme2 As String TIme1 = TimeString Dim DirFiles

msdn()说:

EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,枚举文件可以更有效

如何在返回整个集合之前开始使用集合

下面的代码给出了一个包含45000个文件的目录的运行时间超过3分钟

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方法,它们将一直执行到最后一项以获取计数。在您实际尝试获取计数之前,它可能不会将计数存储在任何位置。另一方面,一个列表/数组中已经有了所有的项,所以也已经有了计数。好的..我想我的句子很混乱。。。糟糕的英语…现在重新措辞。这不是答案。请删除。为了感谢人们,你应该投票选出他们的答案,并将其中一个标记为已接受