昆明市网站建设_网站建设公司_Banner设计_seo优化
2026/1/9 23:26:17 网站建设 项目流程

FSO(File System Object,文件系统对象)是微软提供的一个“工具箱”,它能让我们的VBA程序像手动操作电脑一样,去创建、删除、移动、复制文件和文件夹,还能查看文件信息(比如名字、大小、修改日期)和检查硬盘空间

因为它功能强大,内容也比较多,所以我会分成几期来详细讲解,本期重点介绍如何通过FSO操作文件夹

创建

CreateFolder方法用于创建一个新的文件夹,其语法:

object.CreateFolder(foldername)

一个简单的应用,在路径D:\常用文件下创建一个名为tmp的文件夹

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")fso.CreateFolder ("D:\常用文件\tmp")

以上代码首先声明了一个名为 fso 的变量,其类型为 Object;接着使用 CreateObject 函数创建了一个“Scripting.FileSystemObject”对象的实例,并将其赋值给之前声明的 fso 变量;最后调用了 fso 对象的 CreateFolder 方法创建文件夹

但是,一般为了避免因重复创建而导致的错误,在创建文件夹前,我们通常会先用 FolderExists 方法检查是否存在,因此完整的代码为:

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")If Not fso.FolderExists("D:\常用文件\tmp") Thenfso.CreateFolder ("D:\常用文件\tmp")ElseMsgBox "文件夹已存在"End If

VBA内置的MkDir命令只能创建单级文件夹,且父文件夹必须存在。同样,FSO的CreateFolder方法本身也不能直接创建多级目录因此,创建任意多层文件夹需要额外的逻辑

关于创建多层文件夹,其实基于目前的编程技能,相信大家一定有自己的创建逻辑。当然如果没有头绪也不着急,后续也会分享相关的内容

删除

DeleteFolder方法用于在文件系统中永久移除指定路径的文件夹及其所有子项(包括子文件夹和文件),它是一个无差别删除方法,操作范围涵盖空文件夹和非空文件夹的结构清理

换句话说,DeleteFolder方法会自动递归遍历并删除指定文件夹内的所有层级子目录及文件,无需我们编写额外的递归逻辑代码。这意味着无论文件夹结构多深、内容多少,一次调用即可完成清理

重要提醒:DeleteFolder 方法是永久性删除,不会将文件移入回收站。一旦执行,数据无法通过常规方法恢复,因此,在使用时一定要谨慎

使用方法一,删除指定的文件夹

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")Dim folderPath As StringfolderPath = "D:\常用文件\tmp"' 在执行删除前,先检查文件夹是否存在If fso.FolderExists(folderPath) Thenfso.DeleteFolder folderPath, TrueMsgBox "文件夹删除成功!"ElseMsgBox "指定的文件夹不存在。"End IfSet fso = Nothing

由于DeleteFolder方法的完整语法是

object.DeleteFolder(folderspec, [force])

第二个参数 force 是可选的布尔值,默认值为 False。这意味着,如果文件夹或其内容被设置为只读,删除操作将失败

因此,要强制删除包含只读文件的文件夹,必须将 force 参数显式设置为 True

使用方法二,使用通配符(*?)批量删除

fso.DeleteFolder "D:\常用文件\Backup_*", True

需要注意,通配符仅允许在路径的最后一级目录名中使用,以上代码将匹配所有以“Backup_”开头的子文件夹,并将其全部删除

复制与移动

3.1复制

CopyFolder方法是FileSystemObject对象提供的编程接口,用于将指定源文件夹(及其内部所有内容)完整地复制到目标位置。与简单的文件复制不同,此方法会自动处理文件夹的层级结构,实现“递归复制”,即复制源文件夹本身以及其包含的所有子文件夹和文件

语法如下:

object.CopyFolder source, destination[, overwrite]

前两个参数都好理解,重点看第3个参数overwrite:为可选参数,布尔值(Boolean),指示当目标位置已存在同名文件夹或文件时是否覆盖。默认值为True(覆盖)。设置为False时,如果遇到已存在的项目,操作将因错误而中断

例如,将D:\常用文件\SourceFolder复制到D:\Backups\CopiedFolder下,如果CopiedFolder存在则覆盖

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")Dim sourcePath As String, destPath As StringsourcePath = "D:\常用文件\SourceFolder"destPath = "D:\Backups\CopiedFolder"' 执行复制,True表示覆盖已存在的文件fso.CopyFolder sourcePath, destPath, True

当然,sourcePath也可以使用通配符*或者?,如

sourcePath = "D:\常用文件\Backup_*"

用以实现批量复制多个符合模式的文件夹,但是destPath不可以使用通配符,这一点也是很好理解的,不再赘述

3.2 移动

MoveFolder方法用于将一个或多个文件夹从一个位置移动到另一个位置,其语法为:

object.MoveFolder source, destination

其中,

  • source:要移动的一个或多个文件夹的路径字符串。关键点:路径字符串只能在最后一个部分(即文件夹名部分)包含通配符(如 * 或 ?),用于批量移动匹配的文件夹

  • destination:文件夹要移动到的目标路径。重要限制:此参数不能包含通配符

关于通配符的使用与CopyFolder方法是一致的,可以参考借鉴CopyFolder方法

例如,以下两行代码,destination参数结尾不同,一个有反斜线一个没有,这在执行过程中有何不同呢?

代码1:

fso.MoveFolder "D:\常用文件\SourceFolder", "D:\Backups\CopiedFolder"

代码2:

fso.MoveFolder "D:\常用文件\SourceFolder", "D:\Backups\CopiedFolder\"

代码1中destination 参数结尾无分隔符(\),系统会认为 destination 是要创建的新文件夹的名称,移动操作会以此名称创建目标文件夹。假如此时目标文件CopiedFolder存在,则执行会报错了

而代码2中destination 参数以路径分隔符(\)结尾,那么系统会认为 destination 是一个已经存在的文件夹,匹配的源文件夹将被移动到这个目标文件夹内

因此,初次使用时一定要留心,别把自己整郁闷了

遍历

GetFolder方法会返回一个对应的Folder对象实例,通过 GetFolder 获取Folder对象后,可访问其 Files 集合(获取所有文件)和 SubFolders 集合(获取所有子文件夹)进行遍历

例如,获取Folder对象并访问属性

获取Folder对象后,可以访问其丰富的属性来获取文件夹的详细信息

Dim fso As Object, fld As ObjectSet fso = CreateObject("Scripting.FileSystemObject")Dim folderPath As StringfolderPath = "D:\常用文件"' 使用GetFolder方法获取Folder对象Set fld = fso.GetFolder(folderPath)' 访问Folder对象的属性MsgBox "文件夹名称: " & fld.Name & vbCrLf & _"完整路径: " & fld.path & vbCrLf & _"父文件夹: " & fld.ParentFolder & vbCrLf & _"创建日期: " & fld.DateCreated & vbCrLf & _"最后修改日期: " & fld.DateLastModified & vbCrLf & _"最后访问日期: " & fld.DateLastAccessed & vbCrLf & _"文件夹类型: " & fld.Type & vbCrLf & _"是否为根目录: " & fld.IsRootFolder, _vbInformation, "文件夹信息"

执行后结果显示如下

建议:由于GetFolder方法在路径无效时会抛出错误,因此在实际使用中,强烈建议先使用FolderExists方法验证路径的有效性

当然,GetFolder方法应用不仅仅以上内容,还有更高级用法,后续也会慢慢分享给大家

结束语

最后,记得使用完fso后,要用Set fso = Nothing释放掉哈,养成好习惯

好了,今天的分享就到这里了,咱们下期继续

公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询