分享

该文件可能是只读的 或者您要访问的位置

 shouzhuw 2024-01-30 发布于四川


excelperfect

在《VBA进阶 | 文件操作8:认识Windows Scripting Host》中,我们介绍了FileSystem对象模型。本文详解其中的Folder对象与Folders集合。

Folder对象

使用Folder对象可以访问指定文件夹的所有属性,并提供了复制、移动和删除文件夹的方法,还可以在文件夹内新建一个文本文件。

Folder对象的重要性在于可以通过它访问Folders集合对象。最常用的方法是提取集合中的一个成员以访问某个对象。然而,由于Drive对象在根文件夹仅给出了Folder对象,因此不得不从Folder对象(表示根文件夹中子文件夹的集合)中提取Folders集合对象。利用Folders集合,可以向下搜索整个文件系统以选择其他Folder对象和其他Folders集合。IsRootFolder参数将告诉当前正在处理的Folder对象是否是Drive的根文件夹。

Attributes属性

返回文件夹的属性。FileAttributes常量是一组表示文件夹属性的标志。通过对Attributes返回值和要测试的常量值进行逻辑与(AND),可以确定设置了哪一个标志。例如:

If oFolder.Attributes And ReadOnly Then '文件夹是只读的

FileAttributes常量如下:

1480ede59c5eb683c41e011d5a145d90.png

DateCreated属性

返回文件夹的创建日期,Date类型。

DateLastAccessed属性

如果可以从操作系统获得时间信息,则属性表示最近一次访问文件夹的日期,Date类型。

DateLastModified属性

最近一次修改文件夹的日期,Date类型。

Drive属性

返回一个Drive对象,表示该文件夹所在的驱动器名称。

Files属性

返回文件夹中的文件集合,表示当前文件夹中的所有文件。

IsRootFolder属性

IsRootFolder属性判断文件夹是否为根文件夹,如果是则返回True,Boolean类型。

Name属性

返回文件夹的名称,String类型。

ParentFolder属性

返回指定文件夹的父文件夹。如果当前文件夹是它所在驱动器的根文件夹,则该属性无效。

Path属性

返回文件夹的完整路径,String类型。

Size属性

返回文件夹的大小,以字节表示。包含当前文件夹中所有文件、子文件夹及其内容的全部大小,Variant类型。

SubFolders属性

返回文件夹中的子文件夹的集合,表示当前文件夹内的所有子文件夹。

Type属性

返回文件夹的类型,例如文件夹或者回收站。该属性并未完全实现,总是返回“File Folder”,String类型。

Copy方法

将当前文件夹及其内容(包括其他文件夹)复制到另一个位置,其语法为:

oFolderObj.Copy Destination[,OverwriteFiles]

其中:

1.oFolderObj代表任何能够返回Folder对象的对象变量。

2.参数Destination必需,表示文件夹复制中的目标路径(可包含文件名),String类型,不能在其中使用通配符。

3.参数OverwriteFiles可选,表示是应该覆盖(True)还是不覆盖(False)已存在的文件和文件夹,Boolean类型。

说明:

1.Copy方法将源文件夹中包含的文件夹、所有子文件夹和文件复制到Destination位置,也就是说,Copy方法是递归的。

2.Folder.Copy方法与FileSystemObject.CopyFolder方法不同,对于使用路径分隔符还是非路径分隔符结束Destination,在操作上都是相同的。

3.如果目标路径或者Destination结构中的任何一个文件设置为只读,则不论OverwriteFiles的值如何,Copy方法都将失败。

4.如果OverwriteFiles设置为False,且Destination结构中包含源文件夹或源文件夹中的任意一个文件,将产生错误“文件已经存在”。

5.如果在复制多个文件时出现错误,Copy方法立即停止操作,不再复制剩下的未复制的文件。该方法不具有撤销产生错误之前复制操作的返回功能。

6.如果用户有充分的权限,Destination可为网络路径或共享名。例如:oFolder.Copy\\NTSERV1\d$\RootTwo\

CreateTextFile方法

在指定位置新建一个文件,并返回所创建文件的TextStream对象。其语法为:

oFolderObj.CreateTextFile FileName[,Overwrite[,Unicode]]

其中:

1.oFolderObj代表任何能够返回Folder对象的对象变量。

2.参数FileName必需,表示任何有效的文件名(路径可选),String类型,不允许使用通配符。

3.参数Overwrite可选,一个标志,表示是否覆盖具有相同文件名的已有文件,Boolean类型,默认设置为False。

4.参数Unicode可选,一个标志,表示是用Unicode格式还是ASCⅡ格式写文件,默认设置为False。如果Unicode设置为True,将创建一个Unicode格式的文件,否则创建一个ASCⅡ文本文件。

说明:

1.新建的文本文件只有在进行写操作时才自动打开。如果随后要读这个文件,必须先关闭这个文件,然后以读模式打开该文件。

2.必须使用Set语句把TextStream对象赋给一个局部对象变量。

3.Folder对象中的CreateTextFile方法与FileSystemObject对象中的CreateTextFile方法在操作上是一样的。

Delete方法

删除当前文件夹及其所有文件和子文件夹。其语法为:

oFolderObj.Delete [Force]

其中:

1.oFolderObj代表任何能够返回Folder对象的对象变量。

2.参数Force可选,如果设置为True,则忽略文件的只读标志并删除这个文件,Boolean类型,默认设置为False。

说明:

1.如果文件夹中某些文件已经打开,该方法失败并产生一个“Permission Denied”错误。

2.Delete方法删除指定文件夹中的所有内容,包括其他文件夹和它们的内容。

3.如果参数Force设置为False,且文件夹中的任一文件设置为只读,则该方法失败。

4.如果在删除多个文件或文件夹时出错,Delete方法立即停止操作,不再删除余下没有删除的文件或文件夹,该方法不具有撤销出错前删除操作的返回功能。

5.Folder对象的Delete方法与FileSystemObject的DeleteFolder方法不同,后者可以在路径参数中使用通配符,因而能同时删除多个文件夹,而前者只是删除Folder对象所表示的一个文件夹。

6.执行完Delete方法后,包含Folder对象的Folders集合对象会自动更新。从Folders集合中移除被删除的文件夹,且集合的计数减一。不应再访问已删除的文件夹,应该设置局部对象变量为Nothing,例如下面的代码所示:

Set ofsSubFolder=ofsSubFolders.Item(“roottwo”)

MsgBox ofsSubFolders.Count

ofsSubFolder.Delete False

MsgBox ofsSubFolders.Count

Set ofsSubFolder=Nothing

Move方法

将文件夹结构从某个位置移动到另一个位置。其语法为:

oFolderObj.Move destination

其中:

1.oFolderObj代表任何能够返回Folder对象的对象变量。

2.参数destination必需,指定文件夹移动操作中目标位置的路径,String类型,不能使用通配符,可以为绝对路径或相对路径。

说明:

1.在移动文件夹时,如果其中的某些文件已经打开,则将产生一个错误。

2.如果在移动操作的过程中出错,Move方法将立即停止操作,且不再移动剩下的文件和文件夹。

3.要保证该方法能够完成,可以在调用它之前使用FileSystemObject的FolderExists和GetAbsolutePath方法。

4.Folder.Delete方法和FileSystemObject的MoveFolder方法不同,后者可以在路径参数中使用通配符,所以能够同时移动多个文件夹,而前者只是删除Folder对象表示的一个文件夹及其内容。

5.执行完Move方法后,包含Folder对象的Folders集合对象会立即自动更新:从集合中移除刚被删除的文件夹,集合计数减一。不应该再访问同一Folders集合对象中已经删除的文件夹。

6.如果用户有足够的权限,目标路径可以是网络路径或共享名,例如:Move “\NTSERV1\d$\RootTwo\”

Folders集合

Folders集合对象是Folder对象的容器。通常我们希望从对象所在的集合访问某个对象。例如,我们可能希望从Folders集合对象访问一个Folder对象。然而,情况也可以反过来,我们可以从一个Folder对象的实例访问Folders集合对象。这是因为从Drive对象创建实例的第一个Folder对象是一个Root Folder(根文件夹)对象,从该对象可以实例化一个子文件夹集合。然后又能够实例化其他Folder对象和子文件夹对象,这样就能操作整个驱动器的文件系统。

Item属性

从Folders集合对象检索一个特定的Folder对象,可以通过提供的准确的文件夹名来访问某个文件夹,而不需要知道它的路径。但是,不能通过顺序号来访问该文件夹对象,例如下面的语句返回一个表示roottwo文件夹的Folder对象:

Set ofsSubFolder=ofsSubFolders.Item(“roottwo”)

Count属性

Folders集合包含的Folder对象的数目,Long类型。

Add方法

新建一个文件夹。其语法为:

oFoldersCollObj.Add newfoldername

其中:

1.oFolderCollObj代表任何能够返回Folders集合对象的对象变量。

2.参数newfoldername必需,指定新文件夹的名称,String类型。在newfoldername中不能使用路径标识符,只能使用新文件夹的名称。

新文件夹的位置由Folders集合对象所在的父文件夹决定。例如,如果从一个Folders集合对象调用Add方法,且这个Folders集合对象是根文件夹对象的一个子文件夹集合,则该方法将在根文件夹下创建新的文件夹(即向根Folder对象的子文件夹集合添加新的文件夹),例如:

Dim oFileSys As New FileSystemObject

Dim oRoot As Folder,oChild As Folder

Dim oRootFolders As Folders

Set oRoot=oFileSys.Drives(“C”).RootFolder

Set oRootFolders=oRoot.SubFolders

Set oChild=oRootFolders.Add(“Downloads”)

示例

下面的代码要求用户输入文件夹名称,然后统计该文件夹中的文件数量并显示结果。

Sub CountFilesInFolder()

Dim fs, strFolder,objFolder, colFiles

strFolder =InputBox('请输入文件夹名称(带有完整路径):')

If NotIsFolderEmpty(strFolder) Then

    Set fs =CreateObject('Scripting.FileSystemObject')

    Set objFolder = fs.GetFolder(strFolder)

    Set colFiles = objFolder.Files

    MsgBox '文件夹中的文件数量为' & strFolder & '=' & colFiles.Count

End If

End Sub

'判断文件夹是否为空 

Function IsFolderEmpty(myFolder)

    Dim fs, objFolder

    Set fs =CreateObject('Scripting.FileSystemObject')

    Set objFolder =fs.GetFolder(myFolder)

    IsFolderEmpty =(objFolder.Size = 0)

End Function

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多