我知道之前曾问过这个问题,但我找不到我要找的答案。 我想遍历一个目录并将所有文件读入一个数组。 我不知道该目录包含多少文件,因此我不知道该数组的大小。 实现这一目标的最佳途径是什么? 我读过“ReDim”是一个性能杀手,但我找不到任何类似列表的集合......
我错过了什么吗?
答案 0 :(得分:2)
方法1
一种方式(并且标准来说,它会大量增加)是根据平均用例对数组进行一些任意的维度。
当你要超过数组大小时,重新加载加倍元素的数量。
然后在最后,将其调整到实际所需的大小。
方法2(Bunk)
遍历目录以获取大小。然后在正确调整数组大小的情况下运行代码。由于缺乏原子性,文件系统不可行。在其他用例中,该方法可以很好地工作;不要在这里使用它。
答案 1 :(得分:2)
要么
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