文件系统对象FSO的英文全称是File System Object ,这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法,将一系列操作文件和文件夹的动作通过调用对象本身的属性、方法直接实现。 ※相比于传统的文件操作语句,FSO的功能更加丰富,本章只是简单的文件、目录操作介绍,更多的内容需要读者自己扩展。另外,“面向对象编程”——“对象”、“方法”、“属性”等的概念已经引入,这对于本系列教程面向的读者来说是一个难点(如果想了解的话)。 (一)创建FSO对象
VBA中创建对象有两种方法,一种是将一个变量声明为对象类型:Dim fso As New FileSystemObject;另一种是通过CreateObject方法创建一个FSO 对象:Set fso = CreateObject(“Scripting.FileSystemObject")。 1.前期绑定
第一种方法称为“前期绑定”,先要引用.dll类库文件,写代码的时候有智能提示,但是如果程序发给别人用,那使用者也需要先引用对应的.dll类库文件才行。所以一般的写程序的时候用前期绑定方式,写完后将对象创建代码改成“后期绑定”方式。 首先需要在在工程中引用这个类库文件(scrrun.dll),单击“工程”,“引用”,然后在“引用”对话框中选中“Microsoft Scripting Runtime”前的复选框,然后单击“确定”。 然后在代码在声明变量; Dim fso As New Scripting.FileSystemObject ![]() 2.后期绑定
不需要引用类库文件,但没有智能提示。 Dim fso as Object Set fso =
CreateObject("Scripting.FileSystemObject")
(二)File对象、Folder对象、FSO对象的属性与方法
1.File对象的常用属性
从一个给定路径folderPath
获得文件夹(Folder)对象mainFolder ,然后取得其下的文件对象集合allFiles ,遍历逐个取出文件(File)对象f并取属性输出到Excel的代码如下:
'获取文件夹下文件的属性 Sub FsoGetFileAttributes () Dim
mainFolder, allFiles As Object Dim
folderPath As String Dim index As Integer '创建FileSystemObject对象fso Dim fso As New
FileSystemObject '从路径获得folder对象mainFolder folderPath =
"C:\Users\Administrator\Desktop\vba\demo" Set
mainFolder = fso.GetFolder(folderPath) '获得mainFolder下的文件集合allFiles Set
allFiles = mainFolder.files 'for
each ……in 遍历集合取每一个文件的名字Name index = 1 For Each f In
allFiles Cells(index,
1).Value = f.Name 'Cells(index,
2).Value = f.Path index =
index + 1 Next End Sub
File对象(本节设定其实例为f)常用的属性及其描述、返回值对照如下表:
2.File对象的方法
如果是从路径获取文件、进行操作中,我们应该先要对文件路径是否存在做判断。在介绍File对象的方法之前有必要先将如何通过FSO对象的FileExists方法判断文件是否存在以及如何通过FSO对象的GetFile方法从路径获得一个File对象做出说明。 ※与上节从文件夹路径获得文件夹对象(fso.GetFolder),然后取其下文件对象集合遍历出每个文件对象不同,本节直接从文件路径获得文件对象(fso.GetFile)。
'判断文件是否存在 Sub FsoFileExists() Dim maxRow,
lastRow, index As Integer Dim file As Object '创建FileSystemObject对象fso Dim fso As New
FileSystemObject maxRow =
Rows.Count lastRow =
Cells(maxRow, 1).End(xlUp).Row For index =
1 To
lastRow Step 1 '通过fso对象的FileExists方法判断文件是否存在,结果存入Excel第2列 Cells(index,
2).Value =
fso.FileExists(Cells(index, 1).Value) If fso.FileExists(Cells(index, 1).Value)
Then '如果存在就通过fso对象的GetFile方法(从路径)创建一个File对象 Set file =
fso.GetFile(Cells(index, 1).Value) '取File对象的名字放到Excel第3列 Cells(index,
3).Value =
file.Name End If Next index End Sub
File对象的Copy方法、Delete方法、Move方法使用操作基本相同,2.1-2.3小节只在Copy方法中给出代码。 ※File对象还有一个OpenAsTextStream
方法,不在本教程的教学范围内,可自行了解。该方法打开一个指定的文件并返回一个 TextStream 对象,该对象可用来对文件进行读、写、追加操作。 2.1 Copy方法
把一个指定的文件或文件夹从一个地方复制到另一个地方。该方法在File对象与Folder对象下均有实现且语法一致。 语法 object.Copy destination[, overwrite] Copy 方法语法有如下几部分:
将上例经fso.FileExists方法判断存在的文件复制到1602文件夹内,代码如下:
Sub FsoFileCopy() Dim maxRow,
lastRow, index As Integer Dim file As Object Dim fso As New
FileSystemObject maxRow =
Rows.Count lastRow =
Cells(maxRow, 1).End(xlUp).Row For index =
1 To
lastRow Step 1 If
fso.FileExists(Cells(index, 1).Value)
Then Set file =
fso.GetFile(Cells(index, 1).Value) '执行Copy方法
file.Copy Cells(index, 2).Value,
True End If Next index End Sub
2.2 Delete方法
删除一个指定的文件或文件夹。该方法在File对象与Folder对象下均有实现且语法一致。 语法 object.Delete force Delete 方法语法有如下几部分:
说明 如果指定的文件或文件夹不存在,则发生一个错误。 Delete 方法对于文件夹内是否有内容不做区别。不管指定的文件夹是否有内容,它都被删除。
2.3 Move方法
将一个指定的文件或文件夹从一个地方移动到另一个地方。该方法在File对象与Folder对象下均有实现且语法一致。 语法 object.Move destination Move 方法语法有如下几部分:
3.Folder对象的常用属性
从一个给定路径folderPath
获得文件夹(Folder)对象mainFolder ,然后通过mainFolder的SubFolders属性取得其下的子文件夹对象集合childFolders,遍历逐个取出文件夹(Folder)对象childFolder并取属性输出到Excel的代码如下:
'获取文件夹下子文件夹的属性 Sub FsoGetFolderAttributes() Dim
mainFolder, childFolders As Object Dim
folderPath As String Dim index As Integer '创建FileSystemObject对象fso Dim fso As New
FileSystemObject '从路径获得folder对象mainFolder folderPath =
"C:\Users\Administrator\Desktop\vba\demo" Set
mainFolder = fso.GetFolder(folderPath) '获得mainFolder的子目录集合childFolders Set
childFolders = mainFolder.SubFolders 'for
each ……in 遍历集合取每一个子目录childFolder的路径path index = 1 For Each
childFolder In childFolders Cells(index,
1).Value =
childFolder.Path 'Cells(index,
1).Value = childFolder.Name index =
index + 1 Next End Sub
Folder对象(本节设定其实例为childFolder)常用的属性及其描述、返回值对照如下表:
4.Folder对象的方法
Folder对象的Copy、Delete、Move方法与File对象与相同的实现,此处不再赘述。值得提示的是Delete 方法的实现与Kill语句有明显的不同,它对于文件夹内是否有内容不做区别,不管指定的文件夹是否有内容,都被删除。 ※此外,Folder对象还有一个不在本教程教学范围内的CreateTextFile 方法,该方法创建一个指定的文件名并且返回一个用于该文件读写的 TextStream 对象。 5.创建文件夹(FSO对象的方法)
FSO对象本身也有丰富的方法,在“1.File对象的常用属性”中用到了fso.GetFolder方法从路径获得Folder对象;在“2.File对象的方法”中用到了fso.FileExists方法判断文件是否存在,用到了fso.GetFile方法从路径获得File对象。除此之外,FSO对象还有fso.CreateFolder、fso.FolderExists等常用方法,于VB语句操作文件夹/文件相照应,给出FSO方式的方法——fso.CreateFolder。 CreateFolder 方法
创建一个文件夹。 语法 object.CreateFolder(foldername) CreateFolder 方法有如下几部分:
说明 如果指定的文件夹已经存在,则发生一个错误。 下面给出实例代码,可以看出VB语句创建文件夹的代码稍加改动(下划线处语句)就可以成为FSO创建文件夹的代码,实际操作中完全可以将两种方式结合使用。
'FSO创建文件夹 Sub
FSOCreateFolder() Dim maxRow,
lastRow, index As Integer Dim
MainDirectory As String Dim fso As New
FileSystemObject MainDirectory =
GetMainDirectory(msoFileDialogFolderPicker) & "\" maxRow =
Rows.Count lastRow =
Cells(maxRow, 1).End(xlUp).Row For index =
1 To
lastRow Step 1 fso.CreateFolder MainDirectory &
Cells(index, 1).Value Next index End Sub
'Excel.Application函数获取主路径 Function GetMainDirectory(ByVal
DialogType As MsoFileDialogType) As String With Application.FileDialog(DialogType) If .Show
= True Then
GetMainDirectory = .SelectedItems(1) End If End With End Function
※FSO对象模型有FSO对象、Folder对象、File对象、drive对象、textstream对象5个对象,各对象又有丰富的属性、方法。本教程中不对FSO对象模型做全面展开。
(三)遍历所有文件夹/文件
在Dir函数应用中讲述了如何获取多层级文件结构的文件夹,在这里同样会给出FSO的方法。 1.遍历文件夹路径
首先,构造一个函数GetFolderPath(mainFolderPath),传入路径字符串获得Folder对象,遍历其子文件夹路径存入Excel,每一次调用该函数生成的文件夹路径都是从A列最后一个非空单元格的+1单元格开始放置。然后在FsoGetFolderList()过程的Do循环中调用该函数,在行索引rowIndex=1的时候传入主路径字符串,然后rowIndex开始自增取A列每一个文件夹路径遍历其子文件夹,直到Cells(rowIndex, 1)所指向的单元格值为空,停止Do循环。 具体代码如下:
'调用GetFolderPath函数,rowIndex为1时传入主文件夹路径,往后逐个遍历文件夹取子文件夹 Sub FsoGetFolderList() Dim
rowIndex As Integer rowIndex =
1 Columns(1).Clear Do If
rowIndex = 1 Then
GetFolderPath ("C:\Users\Administrator\Desktop\vba\demo")
Cells(rowIndex, 1).Value = "C:\Users\Administrator\Desktop\vba\demo" Else
GetFolderPath (Cells(rowIndex, 1).Value) End If rowIndex =
rowIndex + 1 Loop Until Cells(rowIndex,
1).Value =
"" End Sub
'定义函数,作用是获取给定文件夹路径(mainFolderPath)的子文件夹 Function
GetFolderPath(mainFolderPath) Dim
mainFolder, childFolders As Object Dim index As Integer '创建FileSystemObject对象fso Dim fso As New
FileSystemObject '从路径获得folder对象mainFolder Set
mainFolder = fso.GetFolder(mainFolderPath) '获得mainFolder的子目录集合childFolders Set
childFolders = mainFolder.SubFolders '行号初始值设定为A列最后一个非空行的+1行,第一次执行的时候index=2 index =
Cells(Rows.Count, 1).End(xlUp).Row
+ 1 'for
each ……in 遍历集合取每一个子目录childFolder的路径path For Each
childfolder In childFolders Cells(index,
1).Value =
childfolder.Path '路径 index =
index + 1 Next End Function
代码运行实例,文件夹树状结构如下: C:\Users\Administrator\Desktop\vba\demo ├─1601 │ ├─二层 │ │
└─三层 │ └─二层1 │ └─三层 │ └─四层 ├─1602 │ └─新建文件夹 └─1605 代码执行结果,B对应A列行是每次执行GetFolderPath函数的返回值,对应的A列同颜色的单元格内容是传入函数的路径字符串参数,在第4、7、8、10次执行时由于传入路径无子文件夹,所以无返回值。 ![]() 2.遍历文件路径
所有文件夹的路径已经遍历出放置到Excel A列,遍历文件夹路径,使用fso.GetFolder方法获取Folder对象,然后取其files集合遍历出各file取Path属性放入B列即可。
Sub GetFileList() Dim
folderPath As String Dim maxRow,
lastRow, maxRowB, LastRowB As Integer Dim i As Integer Dim folder,
allFiles As Object Dim fso As New
FileSystemObject Columns(2).Clear maxRow =
Rows.Count lastRow =
Cells(maxRow, 1).End(xlUp).Row For i =
1 To
lastRow folderPath =
Cells(i, 1).Value Set folder
= fso.GetFolder(folderPath) Set
allFiles = folder.files maxRowB =
Rows.Count LastRowB =
Cells(maxRowB, 2).End(xlUp).Row
+ 1 For Each file In
allFiles Cells(LastRowB,
2).Value =
file.Path
LastRowB = LastRowB + 1 Next Next i End Sub
|
|
来自: iamyounger > 《第二章 目录与文件信息的获取》