我知道以前有人问过这个问题,但我找不到我正在寻找的答案。我想遍历一个目录并将所有文件读入一个数组。我不知道目录包含多少文件,因此我不知道数组的大小。我实现这一目标的最佳方法是什么?我读到“ReDim”是性能杀手,但我没有找到任何类似列表的集合......
我错过了什么吗?
任何一个
Redim arr(0) as String
然后
arr(ubound(arr)) = "newFilename"
ReDim Preserve arr(ubound(arr)+1)
然后在循环之后
ReDim Preserve arr(ubound(arr)-1)
将它缩小到最后一个空元素。
作为使用数组的替代方法。您可以使用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
方法一
一种方法(并且在它出现很多的情况下是标准的)是稍微任意地确定数组的尺寸,但基于平均用例。
当您即将超过数组大小时,将元素数量翻倍。
最后,将其调整为实际需要的大小。
方法 2(双层)
遍历目录以获取大小。然后使用正确大小的数组运行您的代码。由于缺乏原子性,文件系统不可行。尽管在其他用例中,该方法可以很好地工作;不过不要在这里使用它。