明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1754|回复: 4

[转帖]FSO对象模型在VB中的应用

[复制链接]
发表于 2005-4-7 22:06:00 | 显示全部楼层 |阅读模式
从 Visual Basic 的第一版至今,VB中有关文件的处理都是通过使用 Open 、Write以及其它一些相关的语句和函数来实现的。随着软件技术的不断发展,加上面向对象编程概念的日臻成熟,这些文件操作语句已经不能适应软件不断增加的复杂程度的需要了。因此,从VB6.0开始,微软提出了一个全新的文件系统对象FSO。

  一、简介

  文件系统对象FSO的英文全称是File System Object ,这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法。通过采用object.method这种在面向对象编程中广泛使用的语法,将一系列操作文件和文件夹的动作通过调用对象本身的属性直接实现。

  FSO 对象模型不仅可以象使用传统文件操作语句那样实现文件的创建、改变、移动和删除,而且可以检测是否存在指定的文件夹,如果存在,那么,这个文件夹又位于磁盘上的什么位置。更令人高兴的是FSO 对象模型还可以获取关于文件和文件夹的信息,如名称、创建日期或最近修改日期等以及当前系统中使用的驱动器的信息,如驱动器的种类是CD-ROM还是可移动磁盘,当前磁盘的剩余空间还有多少。而以前要获取这些信息必须通过调用Windows API函数集中的相应函数才能实现。

  FSO对象模型包含在Scripting 类型库 (Scrrun.Dll)中,它同时包含了Drive、Folder、File、FileSystemObject和TextStream五个对象。其中Drive用来收集驱动器的信息,如可用磁盘空间或驱动器的类型;Folder用于创建、删除或移动文件夹,同时可以进行向系统查询文件夹的路径等操作;File的基本操作和Folder基本相同,所不同的是Files的操作主要是针对磁盘上的文件进行的;FileSystemObject是FSO对象模型中最主要对象,它提供了一套完整的可用于创建、删除文件和文件夹,收集驱动器、文件夹、文件相关信息的方法。需要注意的是,FSO对象模型提供的方法是冗余的,也就是说在实际使用中,FSO对象模型中包含的不同对象的不同方法进行的却是同样的操作,而且FileSystemObject对象的方法直接作用于其余对象,所以在后面的文章中并没有单独提到FileSystemObject对象,千万不要以为没有提到就不重要,事实上FileSystemObject对象在整个FSO对象模型中无处不在;最后的TextStream对象则是用来完成对文件的读写操作的。

  在初步了解了FSO对象模型之后,下面我们通过实际的代码对不同的对象进行进一步的阐述。

  二、FSO对象模型的应用

  (一)创建FSO对象模型

  由于FSO对象包含在Scripting 类型库 (Scrrun.Dll)中,所以在使用前首先需要在在工程中引用这个文件,单击“工程”,“引用”,然后在“引用”对话框中选中“Microsoft Scripting Runtime”前的复选框,然后单击“确定”。

  要创建FSO对象可以采用两种方法,一种是将一个变量声明为FSO对象类型:
   
   Dim fsoTest As New FileSystemObject;

  另一种是通过CreateObject方法创建一个FSO 对象:

   Set fsoTest = CreateObject(“Scripting.FileSystemObject");

  在实际使用中具体采用哪种声明方法,可根据个人的使用习惯而定。

  完成了FSO对象模型的创建之后,就可以利用创建的对象模型的方法访问下属各个对象的属性来获取所需信息或进行相关操作了,具体的方法在下面结合各个对象分别讲述。

  (二)Drive对象

   上面已经提到Drive对象是用来获取当前系统中各个驱动器的信息的。由于Drive对象没有方法,其应用都是通过属性表现出来的,所以我们必须熟悉Drive对象的属性:

属性 功能
AvailableSpace 返回在指定的驱动器或网络共享上的用户可用的空间容量。
DriveLetter 返回某个指定本地驱动器或网络驱动器的字母,这个属性是只读的。
DriveType 返回指定驱动器的磁盘类型。
FileSystem 返回指定驱动器使用的文件系统类型。
FreeSpace 返回指定驱动器上或共享驱动器可用的磁盘空间,这个属性是只读的。
IsReady 确定指定的驱动器是否准备好。
Path 返回指定文件、文件夹、或驱动器的路径。
RootFolder 返回一个 Folder 对象,该对象表示一个指定驱动器的根文件夹。只读属性。
SerialNumber 返回用于唯一标识磁盘卷标的十进制序列号。
ShareName 返回指定驱动器的网络共享名
TotalSize 以字节为单位,返回驱动器或网络共享的总空间大小。
VolumeName 设置或返回指定驱动器的卷标名。

  从上面的属性可以看到Drive对象基本上包含了日常操作所需的全部的驱动器信息,因此在使用中是非常方便的。下面通过一个实例讲述Drive对象的使用。首先在VB中建立一个工程,然后添加一个命令按钮,将其Caption设置为“TestDrive”,然后在click事件中加入以下代码:

Dim fsoTest As New FileSystemObject
Dim drv1 As Drive, sReturn As String
Set drv1 = fsoTest.GetDrive(“C:\")
sReturn = “Drive " & “C:\" & vbCrLf
sReturn = sReturn & “VolumeName" & drv1.VolumeName & vbCrLf
sReturn = sReturn & “Total Space: " & FormatNumber(drv1.TotalSize / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
sReturn = sReturn & “Free Space: " & FormatNumber(drv1.FreeSpace / 1024, 0)
sReturn = sReturn &“Kb" & vbCrLf
sReturn = sReturn &“FileSystem:" & drv1.FileSystem & vbCrLf
MsgBox sReturn

  其中GetDrive方法返回一个与指定路径中的驱动器相对应的 Drive 对象。该方法的语法格式为object.GetDrive drivespec,object是一个FSO对象的名称,drivespec用于指定驱动器的名称。
按F5运行上述代码,按下TestDrive按钮就会弹出一个消息框显示C盘的信息。 (三)Folder对象

  在FSO 对象模型中,提供了丰富的有关文件夹操作的方法,这些方法分别是:

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

Folder对象的方法 用途
Delete 创建一个文件夹
Move 移动一个文件夹
Copy 复制一个文件夹
Name 检索文件夹的名称

  在此需要强调一点,前面我们曾经提到过FSO对象模型包含的方法是冗余的,所以Folder对象的Delete、Move、Copy方法和FileSystemObject对象的DeleteFolder、MoveFolder、CopyFolder方法实际上是相同的,因此在实际使用中可以任选其中的一种。

  和Drive对象一样,下面通过实例演示Folder对象的应用。在VB下新建一个工程,然后在上面添加三个命令按钮,然后在Form1的通用部分加入以下代码:

Option Explicit
 Dim fsoTest As New FileSystemObject
 Dim folder1 As Folder
 并且分别在三个命令按钮的click事件输入以下代码:
Private Sub CmdCreate_Click()
 ' 获取 Folder 对象。
 Set folder1 = fsoTest.GetFolder(“C:")
 '创建文件夹
 fsoTest.CreateFolder (“C:\Test")
 MsgBox “folder C:\Test has created"
End Sub

Private Sub CmdDelete_Click()
 ' 获取 Drive 对象。
 Set folder1 = fsoTest.GetFolder(“C:")
 '删除文件夹
 fsoTest.DeleteFolder (“C:\Test")
 MsgBox“folder C:\Test has deleted"
End Sub

Private Sub CmdGetPro_Click()
 '获取文件夹的有关信息
 Dim sReturn As String
 Set folder1 = fsoTest.GetFolder(“C:\Windows")
 'sReturn = “The folder's Attributes is " & folder1.Attributes & vbCrLf
 '获取最近一次访问的时间
 sReturn = sReturn & “The folder's last access time is " & folder1.DateLastAccessed &  vbCrLf
 '获取最后一次修改的时间
 sReturn = sReturn & “The folder's last modify time is " & folder1.DateLastModified & vbCrLf
 '获取文件夹的大小
 sReturn = sReturn & “The folder's size is " & FormatNumber(folder1.Size / 1024, 0)
 sReturn = sReturn & “Kb" & vbCrLf
 '判断文件或文件夹类型
 sReturn = sReturn & “The type is " & folder1.Type & vbCrLf
 MsgBox sReturn
End Sub

  上述代码中提到的CreateFolder方法的语法形式为object.CreateFolder(foldername)。foldername指定了要创建的文件夹的名称,而DeleteFolder方法的语法形式为object.DeleteFolder folderspec[,force],其中,folderspec用来指定要删除的文件夹的名称,force是一个可选的布尔型参数,如果希望删除只读属性的文件夹则将该值设为TRUE,默认为FALSE。至于代码中用到的 Folder 对象的属性限于篇幅,就不详细介绍了,读者可参考VB文档中的相关内容。

  (四)File对象和TextStream对象

  由于有关File对象的复制,删除,移动等操作和Folder对象类似,所以这部分内容就不再重复。这里主要讲述利用File对象和TextStream对象操作文本文件。

  通常对文本文件的操作包括在文本文件中创建数据,在文本文件中添加数据,删除文本文件的数据等操作。这些操作都可以通过File对象和FileSystemObject对象的相关方法完成。不过在使用之前,首先要创建一个文本文件,这可以通过三种方法完成。一种方法是使用FileSystemObject对象的 CreateTextFile 方法。要创建一个空文本文件,可以用以下语句:

Dim fsoTest As New FileSystemObject, fil1 As File
Set fil 1= fsoTest.CreateTextFile(“c:\testfile.txt", True)

  第二种方法是使用 FileSystemObject 对象带 ForWriting 标志设置的 OpenTextFile 方法。

Dim fsoTest As New FileSystemObject, ts1 As New TextStream
Set ts1 = fsoTest.OpenTextFile(“c:\testfile.txt", ForWriting)

评分

参与人数 1金钱 +10 贡献 +10 激情 +10 收起 理由
雪山飞狐_lzh + 10 + 10 + 10 【好评】好文章

查看全部评分

 楼主| 发表于 2005-4-7 22:12:00 | 显示全部楼层
在编程中,我们经常需要对文件系统中的驱动器、文件夹和文件进行处理,比如收集驱动器的相关信息;创建、添加、移动或删除文件夹和文件等。在VB6中新提供了一套称为FSO(File System Object)对象模型来对文件系统进行访问处理。该模型提供了一个基于对象的工具,通过它所提供的一系列属性和方法,我们可以在应用程序中更简单、灵活地对文件系统进行各种操作。


  一、FSO简介


  FSO对象模型包含以下几种对象:


  Drive对象:允许收集系统物理或通过LAN与系统逻辑连接的硬盘、CD-ROM等驱动器的可用空间、共享名等信息。


  Folder对象:允许创建、删除或移动文件夹,并向系统查询文件夹的名称、路径等。


  Files对象:允许创建、删除或移动文件,并向系统查询文件的名称、路径等。


  TextStream对象:允许创建和读写文本文件。


  FileSystemObject对象:提供一整套用于驱动器、文件夹和文件操作的方法,在功能上可以把它看作是上面几个对象的集合并且经常与它们配合使用。与该对象相关联的很多方法重复了前面四个对象中的方法,因此我们既可以通过FileSystemObject对象来对驱动器、文件夹和文件进行大多数操作,也可以通过对应的驱动器、文件夹或文件对象对这些组件进行操作。FSO模型通过两种方法实现对同一对象的操作,其操作效果是相同的,提供这种冗余功能的目的是为了实现最大的编程灵活性。


  FSO对象模型包含在一个称为Scripting的类型库中,此类型库位于Scrrun.dll文件中,可从“工程”选单的“引用”对话框中选择“Microsoft Scripting Runtime”项来引用此文件。


  创建一个FileSystemObject对象,可以通过如下两种方法来完成:1将一个变量声明为FileSystemObject对象类型:Dim fso As New FileSystemObject;2使用CreateObject方法来创建:Set fso=CreateObject(″Scripting.FileSystemObject″)。


  二、对驱动器的操作


  对驱动器的操作主要通过Drive对象并配合FileSystemObject对象,FSO不支持进行创建或删除驱动器的操作,而只允许收集关于系统所用驱动器的信息。通过该对象的属性可以获得下列信息:以字节表示的驱动器可用空间(AvailableSpace或FreeSpace);为驱动器指定的字母号(DriveLetter);驱动器类型(DriveType);驱动器使用的文件系统类型,诸如FAT、FAT32、NTFS等(FileSystem);驱动器是否可用(IsReady);驱动器的路径或根文件夹(Path和RootFolder);驱动器序列号(SerialNumber);共享名或卷标名(ShareName和VolumeName);以字节表示的驱动器总空间(TotalSize)。下面一例说明了如何收集有关驱动器的信息:


  Private Sub Command1—Click()


  Dim fso As New FileSystemObject, drv As Drive, str As String


  Set drv=fso.GetDrive(fso.GetDriveName(″c:″))


  Debug.Print ″Total Space: ″ & FormatNumber(drv.TotalSize / 1024, 0) & ″Kb″


  Debug.Print ″Free Space: ″ & FormatNumber(drv.FreeSpace / 1024, 0) & ″Kb″


  End Sub


  三、对文件夹的操作


  Folder对象允许通过所提供的方法来复制(Copy)、删除(Delete)或移动(Move)文件夹,并通过其属性向系统查询其名称(Name)、路径(Path)以及创建日期(DateCreated)等。FileSystemObject 对象对文件夹的操作方法有创建(CreateFolder)、复制(CopyFolder)、移动(MoveFolder)和删除(DeleteFolder)。在进行上述操作之前,首先要获得该文件夹的访问句柄(GetFolder)。下例说明了如何对文件夹进行操作:


  Private Sub Command2—Click()


  Dim fso As New FileSystemObject, fldr As Folder


  Set fldr=fso.GetFolder(″c:″)    


  ′获得当前文件夹的访问句柄


  Debug.Print ″Parent folder name is: ″ & fldr


  ′打印文件夹名


  Debug.Print ″Contained on drive ″ & fldr.Drive   ′打印驱动器名


  fso.CreateFolder (″c:\Temp″)


  ′用FileSystemObject对象创建一个新的文件夹


  fso.DeleteFolder (″c:\Temp″)  


   ′删除新建的文件夹


  End Sub


  访问一个对象,要首先用“Get”方法获得该对象的访问句柄,但如果是用“Create”函数新创建一个对象, 函数会返回一个句柄到新创建的对象,这时只要设置一个变量来获取该句柄即可,不必再用“Get”方法。如:Set fldr=fso.CreateFolder(″C:\Temp2″)。


  四、对文件的操作


  读写文件,在VB6之前都是使用Open等语句来实现,FSO支持通过TextStream对象来创建和读写文本文件。


  FSO通过CreateTextFile、OpenTextFile、OpenAsTextStream 三种方法来创建一个顺序文本文件。文件创建后,就可分三步写入数据:


  1.利用FileSystemObject对象的OpenTextFile方法或File对象的OpenAsTextStream 方法打开文本文件以备写入数据。


  2.使用TextStream 对象的Write、WriteLine或WriteBlankLines方法写入数据。


  3.使用TextStream对象的Close方法关闭文件。


  下例说明了如何创建文本文件:


  我们可使用TextStream 对象的Read、ReadLine或ReadAll方法从一个文本文件中读取数据。


  Private Sub Command3—Click()  


   Dim fso As New FileSystemObject, fil As File, ts As TextStream


   fso.CreateTextFile ″c:\testfile.txt″


   Set fil=fso.GetFile(″c:\testfile.txt″)


   Set ts=fil.OpenAsTextStream(ForWriting)


   ts.Write (″这是一个测试文件!″)


   ts.Close


   Set ts=fil.OpenAsTextStream(ForReading)


   s=ts.ReadLine


   MsgBox s


   ts.Close


  End Sub


    除了创建与读写文件之外,VB6还可通过FileSystemObject对象对文件进行复制(CopyFile)、移动(MoveFile)与删除(DeleteFile)等操作,在File对象中等效的方法有Copy 、Move和Delete。例程如下 :


  Private Sub Command4—Click()


    Dim fso As New FileSystemObject, txtfile As TextStream, fil1 As File, fil2 As File


    Set txtfile=fso.CreateTextFile(″c:\testfile.txt″, True)


    txtfile.Write (″这是一个测试文件!″)


    txtfile.Close


    Set fil1=fso.GetFile(″c:\testfile.txt″)


  ′获得一个文件句柄


    fil1.Copy (″c:\temp1\testfile.txt″)  


  ′将该文件复制到\temp1目录下


    fil1.Move (″c:\temp2\testfile.txt″)  


  ′将该文件移动到\temp2目录下


    Set fil1=fso.GetFile(″c:\temp1\testfile.txt″)


    ′获得这些文件当前位置的句柄


    Set fil2=fso.GetFile(″c:\temp2\testfile.txt″)


    fil1.Delete


    fil2.Delete


  End Sub
 楼主| 发表于 2005-4-7 22:15:00 | 显示全部楼层
在 VB 编程中经常需要和文件系统打交道,比如获取硬盘的剩余空间、判断文件夹或文件是否存在等。在VB 推出文件系统对象(File System Object)以前,完成这些功能需要调用 Windows API 函数或者使用一些比较复杂的过程来实现,使编程复杂、可靠性差又容易出错。使用 Windows 提供的的文件系统对象,一切变得简单多了。以下笔者举出一些编程中比较常用的例子,以函数或过程的形式提供给大家,读者可在编程中直接使用,也可以改进后实现更为强大的功能。
要应用 FSO 对象,须要引用一个名为 Scripting 的类型库,方法是,执行 VB6.0 的菜单项“工程/引用”,添加引用列表框中的“Microsoft Scripting Runtime”一项。然后我们在“对象浏览器”中就可以看到 Scripting 类型库下的众多对象及其方法、属性。
1、判断光驱的盘符:
Function GetCDROM() ' 返回光驱的盘符(字母)
Dim Fso As New FileSystemObject '创建 FSO 对象的一个实例
Dim FsoDrive As Drive, FsoDrives As Drives '定义驱动器、驱动器集合对象
Set FsoDrives = Fso.Drives
For Each FsoDrive In FsoDrives '遍历所有可用的驱动器
If FsoDrive.DriveType = CDRom Then '如果驱动器的类型为 CDrom
GetCDROM = FsoDrive.DriveLetter '输出其盘符
Else
GetCDROM = ""
End If
Next
Set Fso = Nothing
Set FsoDrive = Nothing
Set FsoDrives = Nothing
End Function
2、判断文件、文件夹是否存在:
'返回布尔值:True 存在,False 不存在,filername 文件名
Function FileExist(filename As String)
Dim Fso As New FileSystemObject
If Fso.FileExists(filename) = True Then
FileExist = True
Else
FileExist = False
End If
Set Fso = Nothing
End Function
'返回布尔值:True 存在,False 不存在,foldername 文件夹
Function FolderExist(foldername As String)
Dim Fso As New FileSystemObject
If Fso.FolderExists(foldername) = True Then
FolderExist = True
Else
FolderExist = False
End If
Set Fso = Nothing
End Function
3、获取驱动器参数:
'返回磁盘总空间大小(单位:M),Drive = 盘符 A ,C, D ...
Function AllSpace(Drive As String)
Dim Fso As New FileSystemObject, Drv As Drive
Set Drv = Fso.GetDrive(Drive) '得到 Drv 对象的实例
If Drv.IsReady Then '如果该驱动器存在(软驱或光驱里有盘片,硬盘存取正常)
AllSpace = Format(Drv.TotalSize / (2 ^ 20), "0.00") '将字节转换为兆
Else
AllSpace = 0
End If
Set Fso = Nothing
Set Drv = Nothing
End Function
'返回磁盘可用空间大小(单位:M),Drive = 盘符 A ,C, D ...
Function FreeSpace(drive)
Dim Fso As New FileSystemObject, drv As drive
Set drv = Fso.GetDrive(drive)
If drv.IsReady Then
FreeSpace = Format(drv.FreeSpace / (2 ^ 20), "0.00")
End If
Set Fso = Nothing
Set Drv = Nothing
End Function
'获取驱动器文件系统类型,Drive = 盘符 A ,C, D ...
Function FsType(Drive As String)
Dim Fso As New FileSystemObject, Drv As Drive
Set Drv = Fso.GetDrive(Drive)
If Drv.IsReady Then
FsType = Drv.FileSystem
Else
FsType = ""
End If
Set Fso = Nothing
Set Drv = Nothing
End Function
4,获取系统文件夹路径:
'返回 Windows 文件夹路径
Function GetWindir()
Dim Fso As New FileSystemObject
GetWindir = Fso.GetSpecialFolder(WindowsFolder)
Set Fso = Nothing
End Function
'返回 Windows\System 文件夹路径
Function GetWinSysdir()
Dim Fso As New FileSystemObject
GetWinSysdir = Fso.GetSpecialFolder(SystemFolder)
Set Fso = Nothing
End Function
5,综合运用:一个文件备份通用过程:
'Filename = 文件名,Drive = 驱动器,Folder = 文件夹(一层)
Sub BackupFile(Filename As String, Drive As String, Folder As String)
Dim Fso As New FileSystemObject '创建 FSO 对象实例
Dim Dest_path As String, Counter As Long
Counter = 0
Do While Counter < 6 '如果驱动器没准备好,继续检测。共检测 6 秒
Counter = Counter + 1
Call Waitfor(1) '间隔 1 秒
If Fso.Drives(Drive).IsReady = True Then
Exit Do
End If
Loop
If Fso.Drives(Drive).IsReady = False Then '6 秒后目标盘仍未准备就绪,退出
MsgBox " 目标驱动器 " & Drive & " 没有准备好! ", vbCritical
Exit Sub
End If
If Fso.GetDrive(Drive).FreeSpace < Fso.GetFile(Filename).Size Then
MsgBox "目标驱动器空间太小!", vbCritical '目标驱动器空间不够,退出
Exit Sub
End If
If Right(Drive, 1) <> ":" Then
Drive = Drive & ":"
End If
If Left(Folder, 1) <> "\" Then
Folder = "\" & Folder
End If
If Right(Folder, 1) <> "\" Then
Folder = Folder & "\"
End If
Dest_path = Drive & Folder
If Not Fso.FolderExists(Dest_path) Then '如果目标文件夹不存在,创建之
Fso.CreateFolder Dest_path
End If
Fso.CopyFile Filename, Dest_path & Fso.GetFileName(Filename), True
'拷贝,直接覆盖同名文件
MsgBox " 文件备份完毕。", vbOKOnly
Set Fso = Nothing
End Sub
Private Sub Waitfor(Delay As Single) '延时过程,Delay 单位约为 1 秒
Dim StartTime As Single
StartTime = Timer
Do Until (Timer - StartTime) > Delay
Loop
End Sub
发表于 2005-4-8 14:37:00 | 显示全部楼层
老大出手,必是好东东
发表于 2005-4-16 10:38:00 | 显示全部楼层
好东西~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 18:45 , Processed in 0.185745 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表