0

我知道以前有人问过这个问题,但我找不到我正在寻找的答案。我想遍历一个目录并将所有文件读入一个数组。我不知道目录包含多少文件,因此我不知道数组的大小。我实现这一目标的最佳方法是什么?我读到“ReDim”是性能杀手,但我没有找到任何类似列表的集合......

我错过了什么吗?

4

2 回答 2

3

任何一个

Redim arr(0) as String

然后

arr(ubound(arr)) = "newFilename"
ReDim Preserve arr(ubound(arr)+1)

然后在循环之后

ReDim Preserve arr(ubound(arr)-1)

将它缩小到最后一个元素。


作为使用数组的替代方法。您可以使用CollectionDictionary

集合在初始化时不需要知道它们的大小。Add()您使用他们的方法添加项目。

要查看实现的真实示例,请参阅thisthat


如果您决定使用该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
于 2013-10-22T12:41:37.860 回答
2

方法一

一种方法(并且在它出现很多的情况下是标准的)是稍微任意地确定数组的尺寸,但基于平均用例。

当您即将超过数组大小时,将元素数量翻倍

最后,将其调整为实际需要的大小。

方法 2(双层)

遍历目录以获取大小。然后使用正确大小的数组运行您的代码。由于缺乏原子性,文件系统不可行。尽管在其他用例中,该方法可以很好地工作;不过不要在这里使用它。

于 2013-10-22T12:37:10.493 回答