前景提要
昨天我们首次接触了ADO中FSO的使用,并演示了如何通过FSO来创建一个文件夹,删除文件夹以及判断文件夹是否存在的操作,虽然还是文件夹的相关操作,但是相对于上一列系列,明显功能提升了很多,今天我们继续分享FSO的操作,今天来说下如何通过FSO来执行文件夹的复制。
思路
复制文件夹的话,我们至少需要知道两个条件,首先当前文件夹所在的位置,然后我们需要复制到哪个位置,这两点是必须要知道的,在延伸下,通过之前学习过的对话框的方式来实现自主选择文件夹,(如果你想要复习下昨天分享的判断文件夹是否存在并删除再粘贴的话,也是可以的好了,不过复制的时候,并不需要这一个判断,他会直接覆盖掉原始数据的)
上代码
Sub test()
Dim pathn$, fs As Object, FileName$, NewString$, s$, OldString$
Set fs = CreateObject("Scripting.FileSystemObject")
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "请选择要复制的文件夹"
If .Show = -1 Then
OldString = .SelectedItems(1)
FileName = Split(OldString, "\")(UBound(Split(OldString, "\")))
End If
End With
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "请选择要粘贴的位置"
If .Show = -1 Then
s = .SelectedItems(1)
NewString = s & "\" & FileName
End If
End With
fs.CopyFolder OldString, NewString
MsgBox "复制成功!"
Set fs = Nothing
End Sub
效果如图:
上面的代码要复制的文件夹在桌面,需要复制的地方是D盘下的新建文件夹目录
执行操作前:
这里没有文件夹,只有我们之前创建的案例
image.png
执行操作之后:
image.png文件夹也复制成功,修改日期也变成了我们最新操作的那个时间,说明此操作是成功的
代码解析
首先声明并创建FSOF对象,这个我们在之前说过了
Set fs = CreateObject("Scripting.FileSystemObject")
然后连续两个FileDialog,利用我们之前学习过的方法,灵活的选择我们要复制的文件夹和粘贴的文件夹位置,提高代码的通用性和灵活性
在第一个FileDialog中,我们主要是获得我们需要复制的文件夹的文件名,为什么要获得文件夹的名字呢?因为在之后我们需要利用它和粘贴的文件夹路径组合成为完整的路径,这样才可以执行粘贴的操作,这里利用到了一个split()函数,有点语言基础的童鞋都应该知道split()主要是执行拆分操作的,将文件夹的路径通过“\”这个标签来进行拆分,拆分之后得到的是一个数组类型的(数组的知识,我们后面会单独开一系列来讲,知识面比较大),然后我们利用UBound这个函数取得最大下标,然后获得最后一个元素,即文件名了。现在讲的比较抽象,如果有数组基础的话,就比较好理解,我们利用调试的方式来实现下效果,大家也可以先记住,这种方法是常用的
image.png通过调试,我们看到OldString代表的原文件夹的路径,然后我们拆分的时候就是通过分隔符“\”,拆分成几部分,文件夹的名字就是最后一个部分,通过ubound就可以获得最后一部分了,这样应该好理解一点。
然后第二个FileDialog就是获得我们要粘贴的那个文件夹的位置了,这里我们在插入一个比较基础的知识点,文件夹的路径都是通过“\”来连接的,我们通过FileDialog得到的粘贴路径只有文件夹的位置,我们还需要通过连接的方式来得到粘贴文件夹的完整路径。
image.png然后就是本次的新知识点了,前面做了那么多的准备工作,都是为了这一步,FSO文件夹的复制
fs.CopyFolder OldString, NewString
原来的路径在前,新路径再后。
这里说明一点:复制的话,不需要判断是否有同名文件夹,他会直接覆盖旧的数据,在使用的过程中,要注意这一点,如果你想要保存历史数据的话,最好不要放在同一个文件夹下,或者将旧的数据名字更改下。
完整代码加注释
Sub test()
Dim pathn$, fs As Object, FileName$, NewString$, s$, OldString$
Set fs = CreateObject("Scripting.FileSystemObject") '创建FSO
With Application.FileDialog(msoFileDialogFolderPicker) '调用文件选择框
.Title = "请选择要复制的文件夹" '选择框的名字,人性化
If .Show = -1 Then
OldString = .SelectedItems(1) '文件夹的路径
FileName = Split(OldString, "\")(UBound(Split(OldString, "\"))) '通过拆分和最大下标的方式的活文件名
End If
End With
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "请选择要粘贴的位置"
If .Show = -1 Then
s = .SelectedItems(1) '获得要粘贴的文件夹路径
NewString = s & "\" & FileName '将上面的路径和前面得到的文件名合并,构造要粘贴的文件夹的完整路径
End If
End With
fs.CopyFolder OldString, NewString 'FSO复制文件夹的方法,旧的路径在前,新的路径在后
MsgBox "复制成功!"
Set fs = Nothing '释放FSO
End Sub
网友评论