【发布时间】:2013-10-22 12:34:34
【问题描述】:
我知道以前有人问过这个问题,但我找不到我正在寻找的答案。 我想遍历一个目录并将所有文件读入一个数组。 我不知道目录包含多少文件,因此我不知道数组的大小。 我实现这一目标的最佳方法是什么? 我读到“ReDim”是性能杀手,但我没有找到任何类似列表的集合......
我错过了什么吗?
【问题讨论】:
我知道以前有人问过这个问题,但我找不到我正在寻找的答案。 我想遍历一个目录并将所有文件读入一个数组。 我不知道目录包含多少文件,因此我不知道数组的大小。 我实现这一目标的最佳方法是什么? 我读到“ReDim”是性能杀手,但我没有找到任何类似列表的集合......
我错过了什么吗?
【问题讨论】:
要么
Redim arr(0) as String
然后
arr(ubound(arr)) = "newFilename"
ReDim Preserve arr(ubound(arr)+1)
然后在循环之后
ReDim Preserve arr(ubound(arr)-1)
将其缩小到最后一个 empty 元素。
作为使用数组的替代方法。您可以使用Collection 或Dictionary。
集合在初始化时不需要知道它们的大小。您可以使用他们的Add() 方法添加项目。
如果您决定使用 Dir() 函数并迭代以查看有多少文件,这里有一个示例函数
Sub Main()
ReDim arr(FilesInDirectoryCount("C:\...")) As String
End Sub
Function FilesInDirectoryCount(path As String)
Dim f As String, c As Long
f = Dir$(path)
Do While Len(f) <> 0
c = c + 1
f = Dir$
Loop
FilesInDirectoryCount = c
End Function
或者使用这个
Sub CountFiles()
Dim strDir As String
Dim fso As Object
Dim objFiles As Object
Dim obj As Object
Dim lngFileCount As Long
strDir = "C:\path..."
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFiles = fso.GetFolder(strDir).Files
lngFileCount = objFiles.count
MsgBox lngFileCount
Set objFiles = Nothing
Set fso = Nothing
Set obj = Nothing
End Sub
【讨论】:
ReDim Preserve 不会增加太多开销。
方法一
一种方法(并且在它经常出现的情况下是标准的)是稍微任意地确定数组的尺寸,但基于平均用例。
当您即将超过数组大小时,将元素数量重新调整加倍。
然后在最后,将其缩小到实际需要的大小。
方法 2(双层)
遍历目录获取大小。然后使用正确大小的数组运行您的代码。由于缺乏原子性,文件系统不可行。尽管在其他用例中,该方法可以很好地工作;不过不要在这里使用它。
【讨论】: