分享

三、文件系统对象FSO操作目录与文件

 iamyounger 2018-09-17

文件系统对象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)常用的属性及其描述、返回值对照如下表:

属性

属性作用描述

返回值

 f.Name

返回文件名字

VBA demo.xls

 f.Path

返回文件路径

C:\Users\Administrator\Desktop\vba\demo\VBA demo.xls

 f.ParentFolder

返回父文件夹路径

C:\Users\Administrator\Desktop\vba\demo

 f.Drive

返回磁盘驱动器符号

C:

 f.Size

返回文件大小(字节)

72192

 f.Type

返回文件类型

Microsoft Excel 97-2003 工作表

 f.DateCreated 

返回文件创建时间

2018/8/20 17:31

 f.DateLastAccessed 

返回文件最后一次访问时间

2018/9/5 12:21

 f.DateLastModified  

返回文件最后一次修改时间

2018/9/7 22:07

 f.Attributes  

设置或者返回文件或文件夹的属性

32

 

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方法判断文件是否存在,结果存入Excel2

       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对象的名字放到Excel3

            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 方法语法有如下几部分:

部分

描述

object

必需的。始终是一个 File Folder 对象的名字。

destination

必需的。文件或文件夹要复制到的接受端。不允许有通配符。

overwrite

可选的。Boolean 值,如果该值为 True (缺省),则已存在的文件或文件夹将被覆盖。如果为 False,则它们不被覆盖。

 

将上例经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 方法语法有如下几部分:

部分

描述

object

必需的。始终是一个 File Folder 对象的名字。

force

可选的。Boolean 值,如果要删除具有只读属性设置的文件或文件夹,其值为True。当其值为 False 时(缺省),不能删除具有只读属性设置的文件或文件夹。

 

说明

如果指定的文件或文件夹不存在,则发生一个错误。

Delete 方法对于文件夹内是否有内容不做区别。不管指定的文件夹是否有内容,它都被删除。

 

2.3 Move方法

将一个指定的文件或文件夹从一个地方移动到另一个地方。该方法在File对象与Folder对象下均有实现且语法一致。

语法

object.Move destination

Move 方法语法有如下几部分:

部分

描述

object

必需的。始终是一个 File Folder 对象的名字。

destination

必需的。文件或文件夹要移动到的目标。不允许有通配符。

 

3.Folder对象的常用属性

从一个给定路径folderPath 获得文件夹(Folder)对象mainFolder ,然后通过mainFolderSubFolders属性取得其下的子文件夹对象集合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)常用的属性及其描述、返回值对照如下表:

属性

属性作用描述

返回值

 childFolder.Path

路径

C:\Users\Administrator\Desktop\vba\demo\1602

 childFolder.Name

名称

1602

 childFolder.ParentFolder

父文件夹路径

C:\Users\Administrator\Desktop\vba\demo

 childFolder.Drive

磁盘驱动器符号

C:

 childFolder.Size

文件夹大小(字节)

112257

 childFolder.Type

类型

文件夹

 childFolder.DateCreated 

文件夹创建时间

2018/8/7 19:37

 childFolder.DateLastAccessed 

文件夹最后一次访问时间

2018/9/8 9:14

 childFolder.DateLastModified  

文件夹最后一次修改时间

2018/9/8 9:14

 childFolder.Attributes  

设置或者返回文件或文件夹的属性

16

 childFolder.files.Count

files属性返回文件对象集合,Count属性返回集合计数

3

 childFolder.SubFolders.Count

SubFolders属性返回子文件夹对象集合,Count属性返回集合计数

1

 childFolder.IsRootFolder

是否根文件夹

FALSE

 

4.Folder对象的方法

Folder对象的CopyDeleteMove方法与File对象与相同的实现,此处不再赘述。值得提示的是Delete 方法的实现与Kill语句有明显的不同,它对于文件夹内是否有内容不做区别,不管指定的文件夹是否有内容,都被删除。

※此外,Folder对象还有一个不在本教程教学范围内的CreateTextFile 方法,该方法创建一个指定的文件名并且返回一个用于该文件读写的 TextStream 对象。

5.创建文件夹(FSO对象的方法)

FSO对象本身也有丰富的方法,在“1.File对象的常用属性”中用到了fso.GetFolder方法从路径获得Folder对象;在“2.File对象的方法”中用到了fso.FileExists方法判断文件是否存在,用到了fso.GetFile方法从路径获得File对象。除此之外,FSO对象还有fso.CreateFolderfso.FolderExists等常用方法,于VB语句操作文件夹/文件相照应,给出FSO方式的方法——fso.CreateFolder

CreateFolder 方法

创建一个文件夹。

语法 object.CreateFolder(foldername)

CreateFolder 方法有如下几部分:

部分

描述

object

必需的。始终是一个 FileSystemObject 的名字。

foldername

必需的。字符串表达式,它标识创建的文件夹。

 

说明 如果指定的文件夹已经存在,则发生一个错误。

下面给出实例代码,可以看出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对象模型做全面展开。

方法

描述

fso.BuildPath(path, name)

追加一个名字到一个已经存在的路径

fso.copyfile(source,destination[,overwrite])

将一个或多个文件从某位置复制到另一位置

fso.copyfolder(source,destination[,overwrite])

将文件夹从某位置复制到另一位置

fso.createfolder(strfolder)

创建一个空的文件夹

fso.createtextfile(strfile,blnoverwrite)

创建一个空文件

fso.deletefile(strfileforce)

删除一个文件

fso.deletefolder(strfolder force)

删除一个文件夹

fso.driveExists

如果指定的驱动器存在,返回 True,如果不存在返回 False

fso.fileexists(strfile)

判断指定文件是否存在

fso.folderexists(strfolder)

判断指定文件夹是否存在

fso.GetAbsolutePathName(pathspec)

从提供的路径说明中返回一个完整、明确的路径(类似Dos命令)

fso.getBasename(path)

一个包含路径中最后部件的基本名字(去掉任何文件扩展名)的字符串

fso.GetDrive (drivespec)

一个与指定路径中的驱动器相对应的 Drive 对象

fso.GetDriveName(path)

一个包含指定路径的驱动器名字的字符串

fso.getExtensionName(path)

获取文件后缀名

fso.GetFile(filespec)

一个和指定路径中文件相对应的 File 对象。

fso.GetFileName(pathspec)

指定路径中的最后部件,该路径不是驱动器说明的一部分。

fso.GetFolder(folderspec)

一个和指定路径中文件夹相对应的 Folder 对象

fso.GetParentFolderName(path)

一个包含指定路径最后部件父文件夹名字的字符串

fso.GetSpecialFolder(folderspec)

特殊文件夹,常数WindowsFolderSystemFolderTemporaryFolder

fso.GetTempName

一随机产生的临时文件或文件夹名字,该名字在执行某些操作时有用。

fso.movefile (source, destination)

将一个或多个文件从某位置移动到另一位置

fso.movefolder (source, destination)

将一个或多个文件夹从某位置移动到另一位置

fso.OpenTextFile(filename)

打开一指定的文件,并返回一TextStream对象

 

 

(三)遍历所有文件夹/文件

Dir函数应用中讲述了如何获取多层级文件结构的文件夹,在这里同样会给出FSO的方法。

1.遍历文件夹路径

首先,构造一个函数GetFolderPath(mainFolderPath),传入路径字符串获得Folder对象,遍历其子文件夹路径存入Excel,每一次调用该函数生成的文件夹路径都是从A列最后一个非空单元格的+1单元格开始放置。然后在FsoGetFolderList()过程的Do循环中调用该函数,在行索引rowIndex=1的时候传入主路径字符串,然后rowIndex开始自增取A列每一个文件夹路径遍历其子文件夹,直到Cells(rowIndex, 1)所指向的单元格值为空,停止Do循环。

具体代码如下:

 

'调用GetFolderPath函数,rowIndex1时传入主文件夹路径,往后逐个遍历文件夹取子文件夹

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列同颜色的单元格内容是传入函数的路径字符串参数,在第47810次执行时由于传入路径无子文件夹,所以无返回值。

 

2.遍历文件路径

所有文件夹的路径已经遍历出放置到Excel A列,遍历文件夹路径,使用fso.GetFolder方法获取Folder对象,然后取其files集合遍历出各filePath属性放入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

 

 

 

 

 

 

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多