使用驱动器和文件夹

可以在程序中使用 FSO 对象模型来处理驱动器和文件夹,如同在“Windows 资源管理器”中能进行的交互方式一样。您可以复制和移动文件夹,获得驱动器和文件夹的信息,等等。

获得驱动器的信息

Drive 对象允许获得一个系统的各个驱动器的信息,这些驱动器可以是物理的,也可以是位于网络上的。通过该对象的属性可以获得下列信息:

Drive 对象用法示例

下列示例说明了如何使用 Drive 对象来收集有关驱动器的信息。请记住,在下面的代码中并没有对一个实际 Drive 对象的引用;而是使用 GetDrive 方法来获得一个对已有 Drive 对象(本例中就是 drv)的引用:

Private Sub Command3_Click()
   Dim fso As New FileSystemObject, drv As Drive, s As String
   Set drv = fso.GetDrive(fso.GetDriveName("c:"))
   s = "Drive " & UCase("c:") & " - "
   s = s & drv.VolumeName & vbCrLf
   s = s & "Total Space: " & FormatNumber(drv.TotalSize / 1024, 0)
   s = s & " Kb" & vbCrLf
   s = s & "Free Space: " & FormatNumber(drv.FreeSpace / 1024, 0)
   s = s & " Kb" & vbCrLf
   MsgBox s
End Sub

使用 CurDir、 ChDrive、 ChDir 或 App.Path

如果使用 CurDir 函数、ChDrive 和ChDir 语句、或者 Path 属性 (App.Path),请注意,它们返回的有可能是一个 UNC 路径(即,形如 \\Server\Share而不是一个驱动器路径(如 E:\Folder),这取决于运行程序或工程的方式。

在如下的情况,App.Path 返回一个 UNC 路径:

ChDrive 不能处理 UNC 路径,因此当 App.Path 返回一个 UNC 路径给 ChDrive 时,就会产生一个错误。要避免这个错误,可以在 ChDrive 语句之前添加 On Error Resume Next,或者测试 App.Path 的头两个字符是否是反斜杠:

On Error Resume Next
ChDrive App.Path
ChDir App.Path

这个改动将处理所有使用 UNC 路径从 Windows 启动程序(例如,在“启动”菜单的“运行”对话框中)的情况,因为 Windows 将当前的目录设为一个 UNC 路径。ChDir 可以正确地处理 UNC 路径之间的转换。(ChDrive 的失效可以被忽略,因为 UNC 路径当中没有驱动器号)

然而,如果在 MS-DOS 的命令行提示符后键入一个 UNC 路径来运行程序的话,上面的代码不会生效。这是因为命令行提示符用的总是当前目录的驱动器路径,所以 CurDir 被设为一个驱动器路径。ChDir 不会产生错误,但是它不能将一个目录从驱动器路径变为 UNC 路径。在这种情况下,唯一的解决办法是定位一个已经映射为 UNC 路径中指定共享的本地驱动器,或者使用网络命令来创建这样一个映射。

如果工程是从一个网络共享—— UNC 路径或映射的驱动器路径——加载到 Visual Basic 集成开发环境(IDE)中的话,那么当运行工程时 App.Path 将返回一个 UNC 路径,而切ChDrive 失败并产生一个错误。ChDir 虽然不会出错,但目录并未改变。唯一的解决办法是通过手工来设置驱动器和目录:

Const PROJECTSHARE = "E:\VBPROJ\MYPROJECT"
#Const Debug = True
#If Debug Then
    ChDrive PROJECTSHARE
    ChDir PROJECTSHARE
#Else
    On Error Resume Next
    ChDrive App.Path
    ChDir App.Path
#End If

如果不止一个人可能在共享网络上打开该工程,那么可以使用一个 DOS 环境变量来允许每个人都拥有自己对该共享的映射:

#Const Debug = True
#If Debug Then
    ChDrive Environ("MYPROJECTDIR")
    ChDir Environ("MYPROJECTDIR")
#Else
    On Error Resume Next
    ChDrive App.Path
    ChDir App.Path
#End If

MYPROJECTDIR 的值指定了被映射的驱动器号和路径,例如:

SET MYPROJECTDIR=M:\VBProj\MyProject

使用文件夹

下表显示了普通的文件夹任务以及完成这些任务的方法:

任务 方法
创建一个文件夹 FileSystemObject.CreateFolder
删除一个文件夹 Folder.Delete 或
FileSystemObject.DeleteFolder
移动一个文件夹 Folder.Move 或
FileSystemObject.MoveFolder
复制一个文件夹 Folder.Copy 或
FileSystemObject.CopyFolder
检索文件夹的名称 Folder.Name
查找一个文件夹是否在驱动器上 FileSystemObject.FolderExists
获得已有Folder对象的一个实例 FileSystemObject.GetFolder
找出一个文件夹的父文件夹的名称 FileSystemObject.GetParentFolderName
找出系统文件夹的路径 FileSystemObject.GetSpecialFolder

示例

该示例演示如何使用 Folder 对象和 FileSystemObject 对象来操作文件夹并获得其信息:

Private Sub Command10_Click()
   ' 获得 FileSystemObject 的实例。
   Dim fso As New FileSystemObject, fldr As Folder, s As String
   ' 获取 Drive 对象。
   Set fldr = fso.GetFolder("c:")
   ' 显示父文件夹名。
   Debug.Print "Parent folder name is: " & fldr
   ' 显示驱动器名。
   Debug.Print "Contained on drive " & fldr.Drive
   ' 显示根文件名。
   If fldr.IsRootFolder = True Then
      Debug.Print "This folder is a root folder."
   Else
      Debug.Print "This folder isn't a root folder."
   End If
   '  FileSystemObject 对象创建一个新的文件夹。
   fso.CreateFolder ("c:\Bogus")
   Debug.Print "Created folder C:\Bogus"
   ' 显示文件夹的基本名称。
   Debug.Print "Basename = " & fso.GetBaseName("c:\bogus")
   ' 删除新建的文件夹。
   fso.DeleteFolder ("c:\Bogus")
   Debug.Print "Deleted folder C:\Bogus"
End Sub