“详细介绍如何使用FSO的GetFolder方式获取指定路径下的所有文件(包括子文件夹)”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
本期继续回顾文件及文件夹操作,以熟练掌握FSO(FileSystemObject)操作文件/文件夹的方法
接下来,我们就一起探讨如何运用已学的知识,来获取指定路径下的文件列表?这可是日常生活和办公中使用频度非常高的需求了
如果让你实现,你会怎么做呢?在动手之前我们首先要搞清楚一个非常重要的概念——递归
在任何编程语言中,“递归”都是绕不开的话题,它是一个将复杂问题分解为更小、相似子问题来解决的编程思想。其核心是函数直接或间接地调用自身,并通过明确的终止条件来结束调用
举个例子,我们都有查词典的经历:当查到一个词时,解释中可能会出现不认识的词,于是继续查第二个、第三个词,直到遇到一个完全理解的词为止,然后原路返回,逐层理解之前查过的所有词。因此,递归就是不断深入分解问题和逐层返回结果的过程
若想在编程中正确并安全地使用“递归”,必须确保以下三个要素:
明确的终止条件:这是防止递归无限循环的关键。我们必须定义一个条件,当满足时,函数不再调用自身,而是返回一个确定值
自身调用:函数必须在其内部调用自身,以解决与原问题形式相同但规模更小的子问题
不断向终止条件推进:每次递归调用都必须使问题规模(如参数值)减小,逐步逼近终止条件
有了以上理论知识的加持,我们可以放心大胆地动手实现了
2.1 递归函数实现
目前最常用的方法也是重点推荐的:通过创建 FileSystemObject 对象来访问文件系统,并使用递归函数遍历所有子文件夹
此方法的核心逻辑:首先遍历当前文件夹下的所有文件,将获取到的文件列表输出到活动工作表的A列;然后对其下每一个子文件夹,再次调用自身函数进行遍历
其实现过程可参考以下代码:
Private Sub TraverseFolder(ByVal folder As Object) Dim subFolder As Object Dim file As Object ' 遍历当前文件夹下的所有文件 For Each file In folder.Files ' 将信息写入Excel工作表,如: Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Value = file.path Next file ' 遍历当前文件夹下的所有子文件夹,并对每个子文件夹递归调用本函数 For Each subFolder In folder.SubFolders Call TraverseFolder(subFolder) ' 递归调用 Next subFolderEnd Sub
为了深入理解上述递归函数,我们可以从“递归三要素”这一核心框架入手进行解读:
终止条件:当传入的 folder 对象没有子文件夹(即 folder.SubFolders 集合为空)时,函数在处理完当前文件夹的文件后,退出循环
自身调用语句:Call TraverseFolder(subFolder)
体现“推进”的代码:关键就在于 For Each subFolder In folder.SubFolders 循环内的那句 Call TraverseFolder(subFolder),将函数每次处理的目标,从“当前文件夹”变成了“当前文件夹的某个子文件夹”,问题的“深度”或“范围”明确地缩小
2.2 测试递归函数功能
那么如何调用以上的递归函数呢?可以参考以下测试代码:
Sub GetAllFilesByFSO() Dim fso As Object Dim startFolder As String ' 1. 设置要遍历的起始文件夹路径 startFolder = "D:\常用文件" ' 请修改为你的目标路径 ' 2. 创建FileSystemObject对象 Set fso = CreateObject("Scripting.FileSystemObject") ' 3. 调用递归函数开始遍历 Call TraverseFolder(fso.GetFolder(startFolder)) MsgBox "遍历完成!结果已输出至活动工作表A列。"End Sub
执行GetAllFilesByFSO前,修改startFolder的内容,确保是正确的路径,路径末尾的“\”可加可不加,不影响
执行后结果可参考如下图:
以上方式核心优势在于代码结构清晰、功能强大。我们不仅可以获取文件路径,还能轻松获取文件名、扩展名、文件大小、创建日期、修改日期等详细信息。例如,在遍历时,感兴趣的小伙伴可以尝试:通过修改上述代码,将文件信息(如名称、路径、大小、修改日期)输出到Excel工作表,就会得到一个文件清单了