Ms access FileSystemObject—在For循环中间添加到dir的新对象
我有一个VBA函数,它创建一个FileSystemObject实例,并使用它读取目录的内容,并基于条件逻辑执行一些操作 在函数中,我使用一个循环来读取dir的内容我的问题是:在循环打开后但在循环关闭之前,向目录添加新文件时会发生什么?操作系统是否知道将此文件包括在文件集合中?或者是在循环打开时对dir进行了某种形式的“快照”,导致新添加的文件被忽略 请纠正我上面使用的任何不恰当的术语 我的代码如下:Ms access FileSystemObject—在For循环中间添加到dir的新对象,ms-access,vba,ms-office,Ms Access,Vba,Ms Office,我有一个VBA函数,它创建一个FileSystemObject实例,并使用它读取目录的内容,并基于条件逻辑执行一些操作 在函数中,我使用一个循环来读取dir的内容我的问题是:在循环打开后但在循环关闭之前,向目录添加新文件时会发生什么?操作系统是否知道将此文件包括在文件集合中?或者是在循环打开时对dir进行了某种形式的“快照”,导致新添加的文件被忽略 请纠正我上面使用的任何不恰当的术语 我的代码如下: Function fn_FileCheckType() 'load INI data
Function fn_FileCheckType()
'load INI data
fn_ReadINI
'does filename end with .xls or .xlsx?
'read files from iDumpFolder
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Dim objFolder As Object
Set objFolder = fs.GetFolder(iDumpFolder)
Dim objFile As Object
For Each objFile In objFolder.files
If (objFile.Name Like "*.xls" Or objFile.Name Like "*.xlsx") Then
'do nothing
Debug.Print objFile.Name & " is valid."
Else
'copy to invalid file archive and delete from inbox
objFile.Copy (iInvalidArchive & "\" & objFile.Name)
MsgBox (objFile.Name & " is not saved as .xls or .xlsx. Please modify and re-import.")
objFile.Delete
End If
Next 'objFile
'Cleanup
Set objFolder = Nothing
Set objFile = Nothing
Set fs = Nothing
End Function
您编写示例的方式在每次迭代中都会重新评估
objFolder.files
,因此会获得任何更改。但是,我有点惊讶地看到,如果你这么喜欢
Dim fso As New FileSystemObject
Dim files, f
Set files = fso.GetFolder("C:\~\My test Folder").files
For Each f In files
debug.print f.name
Next f
Debug.Print ' break point here
Debug.Print
即使您不在循环中,
文件
也会被刷新。循环结束后,我在firsPrint
上设置了一个断点,在我的文件夹中添加了一个文件,然后按F8键,Files
更新到正确的文件计数 以下VBA代码表示.Files
集合是引用该集合时文件夹中文件的“快照”。在运行代码之前,我在测试文件夹中放置了两个文件:b.txt
和c.txt
。Debug.Assert
语句在第一次进入循环后立即挂起代码。暂停时,我添加了文件a.txt
和d.txt
,然后按F5继续执行。该代码仅列出文件夹中原来的两个文件
选项比较数据库
选项显式
公共子文件集合测试()
将fso设置为新文件系统对象,将objFolder设置为文件夹,将objFile设置为文件,将i设置为长
设置objFolder=fso.GetFolder(“C:\\uu tmp\zzzTest”)
i=1
对于objFolder.Files中的每个objFile
Debug.Assert i>1
Debug.Print objFile.Name
i=i+1
下一个
设置objFile=Nothing
设置objFolder=Nothing
设置fso=无
端接头
这很容易测试-在循环中放置一个断点,在代码暂停时,向文件夹中添加一个文件。它被处理了吗?在任何情况下,在对集合进行迭代的同时更改集合通常都不是一个好主意-最好先收集所有文件名(如集合对象或数组中的文件名),然后处理这些文件。谢谢-将遵循您的建议。非常有趣,我的测试表明,.Files
集合不会在每次迭代中重新评估。详细情况见我的答案。@GordThompson确实很有趣。你知道我做了什么,这似乎影响了事情,就是我在本地人窗口中展开了文件。我认为这迫使重新评估。听起来似乎有道理。谢谢你的澄清。