Ms access FileSystemObject—在For循环中间添加到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

我有一个VBA函数,它创建一个FileSystemObject实例,并使用它读取目录的内容,并基于条件逻辑执行一些操作

在函数中,我使用一个循环来读取dir的内容我的问题是:在循环打开后但在循环关闭之前,向目录添加新文件时会发生什么?操作系统是否知道将此文件包括在文件集合中?或者是在循环打开时对dir进行了某种形式的“快照”,导致新添加的文件被忽略

请纠正我上面使用的任何不恰当的术语

我的代码如下:

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

即使您不在循环中,
文件
也会被刷新。循环结束后,我在firs
Print
上设置了一个断点,在我的文件夹中添加了一个文件,然后按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确实很有趣。你知道我做了什么,这似乎影响了事情,就是我在本地人窗口中展开了
文件。我认为这迫使重新评估。听起来似乎有道理。谢谢你的澄清。