【Excel VBA 编程】第81讲:文件魔术师——FSO

大家好晚上好!上一期我们认识了FSO这位“文件夹管家”,学会了如何管理文件夹。今天,我们接着请出这位得力助手,让它来大显身手,带我们玩转电脑里的各种文件

判断文件是否存在

FileExists 用于判断指定的文件在磁盘上是否存在,这是一个基础且关键的防错操作,通常在执行文件复制、移动、删除或读取前使用,以避免因文件不存在而引发运行时错误。与FolderExists 作用相同,只是一个用于文件一个用于文件夹

FileExists 很少单独使用,通常作为条件判断的一部分,嵌入到更复杂的文件操作流程中,参考代码如下:

    Dim fso As Object    Set fso = CreateObject("Scripting.FileSystemObject")    If fso.FileExists("D:\常用文件\test103.txt") Then        ' 文件存在时的处理代码,如对文件的删除、移动、复制、读取等操作    End If

由以上代码可知,使用FileExists 前,也必须先创建 FileSystemObject 对象实例

另外,使用该方法还需要注意以下两点:

  • 路径格式问题:VBA中路径分隔符应使用反斜杠 \,使用双反斜杠 \\ 或正斜杠 / 可能导致方法失败

  • 权限问题:FileExists 仅检查文件是否存在,不检查当前用户是否有读取或写入该文件的权限,因此即使返回 True,后续也可能会因权限不足导致操作失败

删除文件

DeleteFile方法能够安全、灵活地删除一个或多个文件,并可通过参数控制对只读文件的处理方式,其语法结构清晰,便于理解:

object.DeleteFile filespec[, force]

其中,

  • object 是一个已创建的FileSystemObject对象实例的名称

  • filespec则是要删除的文件路径和名称,类型为字符串(String),其中文件名可以使用通配符(如 *.* 或 *.txt)来匹配和删除多个文件

  • force 是可选参数,用于决定是否强制删除具有只读属性的文件。默认值为 False,即不删除只读文件;若设置为 True,则会忽略文件的只读属性并执行删除

应用一:单文件删除

删除指定的单个文件,即使该文件为只读也照删不误

    Dim fso As Object    Set fso = CreateObject("Scripting.FileSystemObject")    If fso.FileExists("D:\常用文件\test103.txt") Then        fso.DeleteFile "D:\常用文件\test103.txt", True    End If

应用二:多文件删除

在filespec参数中使用通配符来实现批量删除文件,例如以下代码将会删除掉指定路径下的所有文本文件

fso.DeleteFile "D:\常用文件\*.txt", True

应用三:删除文件夹下所有文件

结合GetFolder方法和遍历Files集合来实现,代码结构更清晰,也便于在删除前进行其他操作(如记录日志)

    Dim fso As Object, folder As Object, file As Object    Set fso = CreateObject("Scripting.FileSystemObject")    Set folder = fso.GetFolder("D:\Backups")    For Each file In folder.Files        fso.DeleteFile file.path, True '强制删除只读文件    Next file

此处需要注意,这段代码只会删除指定文件夹(folder)根目录下的文件,而不会删除其任何子文件夹(例如“Backups子文件夹”)中的文件,如下图所示

复制与移动文件

FSO中对文件复制和移动方法,无论是语法上还是操作上都类似于上期讲的文件夹的操作,可以互相参考使用,效率加倍

3.1复制

CopyFile方法是进行文件复制操作,它功能强大且灵活,允许将单个或多个文件从一个位置复制到另一个位置,其语法和参数如下:

object.CopyFile source, destination[, overwrite]

此处需要注意,无论overwrite参数是True还是False,如果目标文件具有“只读”属性,CopyFile操作将失败,这一点与CopyFolder也是一致的。换句话说就是只读文件是无解的

接下来我们聊一聊CopyFile的几个使用场景

场景一,复制单个文件并保留原名

fso.CopyFile "D:\常用文件\Backup_001.txt", "D:\Backups\"

重要提醒:目标路径 D:\Backups\ 末尾的反斜线(\)是一个路径分隔符,其作用是向 CopyFile 方法明确指出,D:\Backups\ 是一个已经存在的文件夹,需要将源文件复制到该文件夹内

反之,如果没有末尾的反斜线,CopyFile 方法会将其解释为一个新的完整文件名,这意味着它会尝试将源文件复制并重命名为 Backups

场景二,复制单个文件并重命名

fso.CopyFile "D:\常用文件\Backup_001.csv", "D:\Backups\Sales_20251228.csv"

以上代码是在目标路径中指定新文件名,以实现复制并重命名文件

场景三,使用通配符批量复制文件

fso.CopyFile "D:\常用文件\*.csv", "D:\Backups\"

使用通配符是CopyFile方法的一大优势,但需要注意,通配符只能用在source参数的最后一个路径组件中。例如以上代码,复制某个文件夹下所有特定类型的文件

至此,是不是越看越与CopyFolder方法相似呢?简直是一个模子刻出来的

3.2 移动

oveFile方法能将一个或多个文件从一个位置移动到另一个位置,并支持通配符进行批量操作,其语法为:

object.MoveFile source, destination

一看到语法就有一种似曾相识燕归来的感觉,不错,和MoveFolder如出一辙,就不再详细介绍了,直接看使用

使用一,移动文件并重命名

fso.MoveFile "D:\常用文件\Backup_001.csv", "D:\Backups\Backup_20251228.csv"

移动文件到Backups路径,并同时将文件名由Backup_001.csv改为Backup_20251228.csv

使用二,仅移动文件不重命名

fso.MoveFile "D:\常用文件\Backup_001.csv", "D:\Backups\"

同样目标路径以反斜杠结尾,则被视为文件夹

使用三,使用通配符批量移动文件

fso.MoveFile "D:\常用文件\*.*", "D:\Backups\"

MoveFile方法支持使用通配符(如*和?)来批量移动符合模式的文件,例如以上语句会将文件夹下的所有文件移动到目标路径下

友情提醒:如果source中使用的通配符没有匹配到任何文件,方法也是会报错的

获取文件属性

GetFile方法是获取指定文件对象的核心工具,它允许我们访问并操作文件的详细属性和信息,是进行高级文件管理的基础

GetFile会返回一个代表该文件的“对象模型”,通过这个对象,我们可以查询文件的详细信息(如大小、日期、类型等),并调用其方法(如.Copy、.Move、.Delete)来执行操作

例如,获取指定文件信息

    Dim fso As Object, fileObj As Object    Dim infoMsg As String    Set fso = CreateObject("Scripting.FileSystemObject")    '获取File对象    Set fileObj = fso.GetFile("D:\常用文件\Backup_001.csv")    ' 通过File对象的属性获取详细信息    With fileObj        infoMsg = "文件名称:" & .Name & vbCrLf & _                    "文件类型:" & .Type & vbCrLf & _                    "文件大小:" & Format(.Size / 1024, "0.00") & " KB" & vbCrLf & _                    "完整路径:" & .path & vbCrLf & _                    "所在文件夹:" & .ParentFolder & vbCrLf & _                    "创建时间:" & .DateCreated & vbCrLf & _                    "修改时间:" & .DateLastModified & vbCrLf & _                    "访问时间:" & .DateLastAccessed    End With    MsgBox infoMsg, vbInformation, "文件信息"

执行后结果如下:

结束语

最后小贴士:FSO对象没有提供直接的文件或文件夹重命名功能。如需重命名,通常需要结合使用 MoveFile 或 MoveFolder 方法

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wei1019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值