この質問が以前に尋ねられたことは知っていますが、探している答えが見つかりません。ディレクトリを反復処理し、すべてのファイルを配列に読み込みたい。ディレクトリに含まれるファイルの数がわからないため、配列のサイズもわかりません。これを達成するための最良の方法は何ですか? 「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()
。
実装の実際の例を見るにはthis
、 およびを参照してください。that
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
方法 1
1 つの方法 (多くの場合は標準的な方法) は、平均的なユース ケースに基づいて、配列をある程度任意にディメンション化することです。
配列のサイズを超えそうになったら、要素数を2 倍にリディメンションします。
最後に、実際に必要なサイズにサイズを変更します。
方法 2 (寝台)
ディレクトリをトラバースしてサイズを取得します。次に、正しいサイズの配列でコードを実行します。ただし、原子性がないため、ファイルシステムには適していません。このアプローチは、他のユースケースでもうまく機能します。ただし、ここでは使用しないでください。