VBA实现目录递归查找
yuyutoo 2025-01-02 20:10 3 浏览 0 评论
有时候我们需要读取某个目录下所有文件,并且按照文件名进行筛选文件。本篇利用VBA实现了该功能。
代码
Function ListCustomFilesInFolderRecursively(FolderPath As String, Optional CustomRuleName As Variant) As Variant
'''
' 列出指定文件夹及其所有子文件夹中满足特定规则(如果提供)的文件路径。
'
' 参数:
' FolderPath (String) - 要搜索的文件夹的路径。
' CustomRuleName (Variant, Optional) - 可选的正则表达式规则,用于过滤文件名。
'
' 返回值:
' Variant - 包含匹配文件路径的数组(如果找到文件);如果没有找到文件,则返回一个空数组。
'''
Dim FSO As Object
Dim Folder As Object
Dim SubFolder As Object
Dim File As Object
Dim FileName As String
Dim FilePaths() As Variant ' 用于存储文件路径的数组
Dim FileCount As Long ' 跟踪数组中的文件数量
Dim Pattern As String ' 正则表达式模式
Dim Regex As Object ' 正则表达式对象
Dim Err As Object
' 初始化文件计数为0和文件路径数组
FileCount = 0
ReDim FilePaths(0 To 0) ' 初始化为一个元素的数组,用于可能的ReDim Preserve
' 创建FileSystemObject对象
Set FSO = CreateObject("Scripting.FileSystemObject")
' 检查文件夹是否存在
If Not FSO.FolderExists(FolderPath) Then
ListCustomFilesInFolderRecursively = Array() ' 如果没有找到文件夹,则返回一个空数组
Exit Function
End If
' 如果提供了CustomRuleName,则创建正则表达式对象并设置模式
If Not IsMissing(CustomRuleName) Then
Set Regex = CreateObject("VBScript.RegExp")
With Regex
.Global = True ' 设置全局匹配
.Pattern = CustomRuleName ' 设置正则表达式模式
End With
End If
' 设置文件夹对象并遍历文件夹中的文件
Set Folder = FSO.GetFolder(FolderPath)
On Error Resume Next ' 开始错误处理
For Each File In Folder.Files
FileName = FSO.GetFileName(File.Name) ' 获取文件名,不包括路径
' 如果提供了CustomRuleName,则使用正则表达式检查文件名
If Not IsMissing(CustomRuleName) And Regex.Test(FileName) Then
' 将文件路径添加到数组中
ReDim Preserve FilePaths(0 To FileCount) ' 调整数组大小
FilePaths(FileCount) = File.Path
FileCount = FileCount + 1
ElseIf IsMissing(CustomRuleName) Then
' 如果没有提供CustomRuleName,则默认匹配所有文件
' 将文件路径添加到数组中
ReDim Preserve FilePaths(0 To FileCount) ' 调整数组大小
FilePaths(FileCount) = File.Path
FileCount = FileCount + 1
End If
Next File
' 遍历子文件夹
For Each SubFolder In Folder.SubFolders
' 递归调用此函数来处理子文件夹,并将结果添加到数组中
Dim SubFolderFiles As Variant
SubFolderFiles = ListCustomFilesInFolderRecursively(SubFolder.Path, CustomRuleName)
' 将子文件夹中的文件路径追加到主数组中
If IsArray(SubFolderFiles) Then ' 确保SubFolderFiles是一个数组
Dim i As Long
For i = LBound(SubFolderFiles) To UBound(SubFolderFiles)
ReDim Preserve FilePaths(0 To FileCount) ' 调整数组大小
FilePaths(FileCount) = SubFolderFiles(i)
FileCount = FileCount + 1
Next i
End If
Next SubFolder
On Error GoTo 0 ' 结束错误处理
' 清理对象
If Not IsMissing(CustomRuleName) Then
Set Regex = Nothing
End If
Set File = Nothing
Set SubFolder = Nothing
Set Folder = Nothing
Set FSO = Nothing
' 返回包含文件路径的数组(或空数组如果没有找到文件)
If FileCount > 0 Then
ListCustomFilesInFolderRecursively = FilePaths
Else
' 如果没有找到任何文件,返回空数组
ListCustomFilesInFolderRecursively = Array()
End If
End Function
测试
一个简单的测试,找出给定目录下所有的excel文件。
Sub test()
res = ListCustomFilesInFolderRecursively("F:\practice\vba-jsa\vba_20231121", ".xlsx|.xls")
End Sub
代码说明
上述代码定义了一个名为 ListCustomFilesInFolderRecursively 的 VBA 函数,其主要功能是递归地列出指定文件夹及其所有子文件夹中满足特定规则(如果提供)的文件路径。以下是对代码的简要解释:
- 函数定义与参数:FolderPath:一个字符串,代表要搜索的文件夹的路径。CustomRuleName:一个可选的变体类型参数,用于提供正则表达式的规则来过滤文件名。
- 局部变量声明:FSO:用于文件系统操作的 Scripting.FileSystemObject 对象。Folder、SubFolder、File:分别代表当前处理的文件夹、子文件夹和文件对象。FileName:用于存储当前文件的名称。FilePaths:一个数组,用于存储所有匹配的文件路径。FileCount:一个长整型变量,用于跟踪数组中已存储的文件数量。Pattern:用于存储正则表达式的模式(但在这个代码版本中并未使用)。Regex:一个正则表达式对象,用于测试文件名是否匹配提供的规则。Err:一个错误对象,但在这个代码版本中并未使用。
- 初始化:初始化文件计数为0,并初始化文件路径数组为一个元素的数组,以便后续使用 ReDim Preserve 来调整数组大小。
- 检查文件夹是否存在:使用 FSO 检查提供的 FolderPath 是否存在。如果不存在,函数返回一个空数组。
- 创建正则表达式对象(如果提供了规则):如果提供了 CustomRuleName,则创建一个正则表达式对象并设置其全局匹配属性和模式。
- 遍历当前文件夹的文件:对于当前文件夹中的每个文件,检查其名称是否匹配正则表达式(如果提供了规则),或者如果没有提供规则,则默认匹配所有文件。匹配的文件路径被添加到 FilePaths 数组中。
- 递归遍历子文件夹:对于当前文件夹的每个子文件夹,递归调用 ListCustomFilesInFolderRecursively 函数,并将结果(子文件夹中的文件路径)追加到主 FilePaths 数组中。
- 错误处理:使用 On Error Resume Next 来忽略处理文件或子文件夹时可能发生的错误(例如,权限问题)。
- 清理:在函数结束前,释放所有创建的对象,以避免内存泄漏。
- 返回值:如果找到了匹配的文件,函数返回包含这些文件路径的数组。如果没有找到任何文件,函数返回一个真正的空数组。
这个函数通过递归地遍历文件夹和子文件夹,以及使用正则表达式(如果提供)来过滤文件名,提供了一个灵活且强大的工具来列出指定文件夹结构中的文件。
相关推荐
- YAML配置文件简介及使用(yaml 配置)
-
简介YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)的缩写。相比JSON格式的方便。...
- 教你如何解决最常见的58种网络故障排除方法
-
1.故障现象:网络适配器(网卡)设置与计算机资源有冲突。分析、排除:通过调整网卡资源中的IRQ和I/O值来避开与计算机其它资源的冲突。有些情况还需要通过设置主板的跳线来调整与其它资源的冲突。2.故障现...
- 一分钟带你了解服务器网卡(服务器网卡怎么用)
-
今天小编和大家聊一下服务器的网卡。什么是网卡?简单说网卡就是计算机与局域网互连的设备。计算机主要通过网卡接入网络。网卡又称为网络适配器或网络接口卡NIC(NetworkinterfaceCard)...
- linux文件之ssh配置文件的含义与作用
-
ssh远程登录命令是操作系统(包括linux和window系统)下常用的操作命令,可以帮助用户,远程登录服务器系统,查看,操作系统相关信息。linux系统对于ssh命令有专门保存其相关配置的目录和文件...
- Cilium 官方文档翻译 - IPAM(二)Kubernetes Host模式
-
KubernetesHostScopeciliumIPAM的kuberneteshost-scope模式通过选项ipam:kubernetes开启,将集群IP地址分配委托给每个独立的节点,并...
- 域名劫持跳转,域名劫持跳转的解决办法只需5步
-
简单来说,域名劫持就是把原本准备访问某网站的用户,在不知不觉中,劫持到仿冒的网站上,例如用户准备访问某家知名品牌的网上商店,黑客就可以通过域名劫持的手段,把其带到假的网上商店,同时收集用户的ID信息和...
- Linux 磁盘和文件系统管理(linux磁盘管理fdisk)
-
1检测并确认新硬盘...
- windows host文件怎么恢复?局域网访问全靠这些!
-
windowshost文件怎么恢复?windowshost文件是常用网址域名及其相应IP地址建立一个关联文件,通过这个host文件配置域名和IP的映射关系,以提高域名解析的速度,方便局域网用户使用...
- Nginx配置文件详解与优化建议(nginx 配置详解)
-
1、概述今天来详解一下Nginx的配置文件,以及给出一些配置建议,希望能对大家有所帮助。...
- Mac电脑hosts文件锁定,如何修改hosts文件权限
-
有时候我们需要修改hosts文件,但是网上很多教程都行不通,使用sudo命令也不行。其实有一个很简单的方法。打开终端命令行,使用如下命令即可:sudochflags-hvnoschg/etc/...
- windows电脑如何修改hosts文件?(windows 修改hosts文件)
-
先来简单说下电脑host的作用hosts文件的作用:hosts文件是一个用于储存计算机网络中各节点信息的计算机文件;作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中...
- Vigilante恶意软件行为怪异:修改Hosts文件以阻止受害者访问盗版网站
-
Sophos刚刚报道了一款名叫Vigilante的恶意软件,但其行为却让许多受害者感到不解。与其它专注于偷密码、搞破坏、或勒索赎金的恶意软件不同,Vigilante会通过修改Hosts文件...
- hosts文件无法修改几种现象和解决方法
-
第一种、hosts文件修改完不是直接保存而是弹出另存为窗口解决:1、右击hosts文件——属性——把“只读”前面勾去掉。第二种、打开hosts文件时提示“你没有权限打开该文件,请向文件的所有者或管理员...
- hosts文件位置在哪里,教你hosts文件位置在哪里
-
Hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的I...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
【开源分享】2024在线客服系统PHP源码(安装教程+全新UI)
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)