谈vb目录文件操作的三种方法

        对于程序,无论大到一个操作系统,小到一个单一功能的应用软件来说,很多时候,我们都要将一些数据记录和存储到磁盘中.可见,对目录和文件的操作是多么的重要.下面我们就和大家一起学习一下vb中可以应用的三种方法:1、使用现成的控件2、使用visualbasic中提供的方法3、使用windows提供的应用程序编程接口(api)。下面我们具体看看这些方法。
            第一部分   目录操作
            一、使用现成控件
            (一) 察看和显示目录下的文件和文件夹
            对于这个实现,其实很简单。首先想到的就是vb中给我们提供的现成的控件。主要有这么两类:一类是驱动器列表框(DriveListBox)、目录列表框(DirListBox)和文件列表框(FileListBox)三个控件组合而成的自定义对话框;另一类是windows提供的标准对话框。
            他们在工具箱中的位置和图标如下所示:
               
            1、驱动器列表框是一个下拉式的列表框,他和一般下拉式的列表框的不同仅在于功能上的不同,它提供了一个驱动器的列表。当单击右边的箭头时,则弹出计算机中的所有驱动器的下拉列表。默认状态下,在驱动器列表中显示的是当前驱动器,我们可以输入或从下拉列表中选择有效的驱动器标示符.
             
        下面是它的主要属性,事件和方法.
              属性Drive本属性用于返回或设置运行时选择的驱动器.默认值为当前驱动器 , 改变Drive属性会触发Change事件.  
              示例:  Drive1.Drive = “c:/”  
              设置C盘为当前驱动器.
              事件Change当选择一个新驱动器或通过代码改变了Drive属性时触发该事件                  

            下面是示例代码:

Private Sub Drive1_Change()
                     Dir1.Path 
= Drive1.Drive  
             ‘当选择一个新驱动器时,将驱动器列表中选中的当前驱动器,赋给目录列表的路径.
 
End Sub

        2、目录列表框
           目录列表框用于显示当前驱动器的目录结构,目录列表框从最高层目录开始,显示当前驱动器的目录结构,并按层次关系缩进跟目录下的所有子目录。下面是它的主要属性,方法和事件:
             属性Path本属性用于返回或设置运行时选择的路径,默认路径为当前路径.改变Dri属性会触发Change事件. 
                  示例:  Dri1.Path = Drive1.Drive  
             设置在驱动器列表框中选中的驱动器盘符为目录列表的当前路径.
             ListIndex本属性用来返回或设置控件中当前被选择的项目索引号.目录列表框中的每一个目录都可以通过ListIndex属性来标识.由Path属性所设置的当前目录的ListIndex属性值总是-1,而它上面的目录的ListIndex属性值为-2,再上面的为-3,以此类推;而它所包含的子目录恰恰相反,紧挨着的第一个子目录的ListIndex属性值为0,往下一次加一.
            ListCount本属性返回当前目录下的所有子目录书.ListCount的值比最大的ListIndex的值大1.
            事件Change当选择一个新目录或通过代码改变了Path属性时触发该事件                  

            下面是示例代码:

Private Sub Dir1_Change()             
            
'将文件列表框的路径值,设置为目录列表框所选中的路径值
            File1.Path = Dir1.Path             
End Sub

        3、文件列表框
            文件列表框用来显示当前目录中的部分或者全部文件.文件列表框的大部分属性和一般的列表框相同,都具有大小,位置,字体,颜色等以及List,ListCount,ListIndex等属性.下面是主要的属性:
             属性Path本属性用于返回或设置运行时选择的路径以显示其下的文件,默认路径为当前路径.改变Dri属性会触发PathChange事件.                    
                  示例: File1.Path= Dri1.Path   
             设置在目录列表框中选中的路径为文件列表的当前路径.
             Pattern本属性用来确定程序运行时,列表框中显示那些类型的文件.除了使用”*” ,   ”?”等通配符外,在参数中还可以使用分号”;”来分割多种文件类型.例如:”*.ext;*.bat”                   
             FileName本属性返回或设置所选文件的路径和文件名.可以从本属性值中返回当前列表中选择的文件名.路径可用Path属性单独检索.在功能上,本属性值与ListIndex等价.如果没有文件被选中,FileName属性将返回0长度的字符串.改变甭属性值可能会产生一个或多个如下事件:PathChange(如果改变路径),PatternChange(如果改变模式),DblClick(如果指定存在的文件)
             事件Click当选择一个新的文件时触发该事件                 

            下面是示例代码:

Private Sub File1_Click()
                Picture1.Picture 
= LoadPicture(Dir1.Path & "  " & File1.FileName)
            ‘在图片框中显示选定的图形文件.
End Sub

        4、标准对话框
            CommonDialog控件提供了一组标准的操作对话框,进行诸如打开,和保存文件,设置打印选项,以及选择颜色和字体等操作.通过运行windows帮助引擎还能显示帮助.
            CommonDialog控件在visual basic和Microsoft  Windows动态链接库commdlg.dll的例程之间提供了一个接口.为了用这个控件创建一个对话框,commdlg.dll必须存在于microsoft  Windows的system目录下.然后再visual basic中选择工程/部件,并在显示的部件对话框中选中Microsoft   common Dialog Control 6.0,确定后,在工具栏里就显示了出来.如下图所示:
            在应用程序中要使用CommonDialog控件,可将其添加到窗体中并设置其属性.控件所显示的对话框有控件的方法确定.在运行时,当相应的方法被调用时,将显示一个对话框或是执行帮助引擎;在设计时,CommonDialog
            控件是以图标的形式显示在窗体中的.该图标的大小不能改变.
            使用指定的方法,CommonDialog控件能够显示下列对话框:
                  方法所显示的对话框
                  ShowOpen              显示[打开]对话框
                  ShowSave               显示[另存为]对话框
                  ShowColor              显示[颜色]对话框
                  ShowFont                显示[字体]对话框
                  ShowPrinter            显示[打印]或[打印选项]对话框
                  Showhelp               显示windows帮助引擎            
         下面是它的主要属性,方法:
              属性Filer该属性应用于CommonDialog控件中的[打开][另存为]对话框.本属性用来返回或设置在对话框[类型]列表框中显示的过滤器.过滤的作用是确定对话框中文件列表框中显示的文件类型.例如:设置为*.txt时,将显示文本文件.要显示多种类型的文件,可以用管道(|)符号(ASCII124)将他们分开.管道符号前后不能加空格.如:*.rm|*.rmvb
              Action该属性返回或设置一个表示所显示对话框类型的整数.具体如下.
                  设置数值说明
                  0         没有操作
                  1         显示[打开]对话框
                  2         显示[另存为]对话框
                  3         显示[颜色]对话框
                  4         显示[字体]对话框
                  5         显示[打印]或[打印选项]对话框
                  6         运行WINHLP32.EXE            
             FileName本属性应用于CommonDialog控件的[打开][另存为]对话框.
                  本属性返回或设置所选文件的路径和文件名.如果在运行时被创建,FileName属性将返回0长度的字符串,表示当前没有选择文件.在CommonDialog控件里,可以在打开对话框之前设置FileName属性来设定初始文件名.
                  可以从本属性值中返回当前列表中选择的文件名.路径可用Path属性单独检索.在功能上,本属性值与ListIndex等价.如果没有文件被选中,FileName属性将返回0长度的字符串.
                  改变甭属性值可能会产生一个或多个如下事件:PathChange(如果改变路径),PatternChange(如果改变模式),DblClick(如果指定存在的文件)
            事件Click当选择一个新的文件时触发该事件                  

            下面是一个例子:
            我们在这里要做一个vcd的播放器下面是界面.
            下表是其中所用到的控件及其属性设置:
                  对象特性设置值
                  窗体名称          Frmvcd
                   BorderStyle    1
                   Caption           Vcd播放器
                  菜单标题文件                  
                   名称Mnufile
                  标题打开
                  名称Mnuopen
                  标题播放
                  名称Mnuplay
                  标题退出
                  名称Mnuexit                
                   标题选项
                  名称Mnuoption
                  标题连续播放
                  名称Mnurepeat
                  标题静音
                  名称Mnuslient
                  多媒体控件名称Mmcontrol
                  Picture控件名称Picture1
                  通用对话框名称Commondialog1     
             
            下面是主要程序代码代码:

Private Sub mnuopen_Click()  ’当点击菜单中的打开时执行
             
            
'在未选择文件时,文件名为空字符,播放菜单不可用
            mnuplay.Enabled =False
            CommonDialog1.FileName 
= ""
            
'下面语句设置文件过滤方式,可显示扩展名为avi,dat,wav和mid文件
            CommonDialog1.Filter = "(*.avi)|*.avi|(*.wave)|*.wav|(vcd 
            *.dat)|*.dat|(midi *.mid)|*.mid"
            '初始化文件过滤方式为*.avi
            CommonDialog1.FilterIndex = 1
            
'建立打开方式的通用对话框,也可使用commondialog1.showopen
            CommonDialog1.Action = 1
            
'打开一个文件前先关闭前一次被打开的多媒体设备
            MMControl1.Command = "close"
            
Select Case CommonDialog1.FilterIndex
                
Case 1  '选择*.avi
                   '设置多媒体设备类型为avividio
                   MMControl1.DeviceType = "avividio"
                   
'设置时间格式为帧
                   MMControl1.TimeFormat = 3
                   
'设置播放的文件为通用对话框中选择的文件
                    MMControl1.FileName = CommonDialog1.FileName
                   
'打开文件
                    MMControl1.Command = "open "
                
Case 2 '选择*.wav
                   '设置多媒体设备类型为waveaudio
                   MMControl1.DeviceType = "waveaudio"
                  
'设置时间格式为帧
                  MMControl1.TimeFormat = 3
                  
'设置播放的文件为通用对话框中选择的文件
                   MMControl1.FileName = CommonDialog1.FileName
                  
'打开文件
                   MMControl1.Command = "open "
                
Case 3  '选择*.dat
                    '设置多媒体设备类型为Mpegvidio
                    MMControl1.DeviceType = "Mpegvidio"
                   
'设置时间格式为帧
                   MMControl1.TimeFormat = 3
                   
'设置播放的文件为通用对话框中选择的文件
                   MMControl1.FileName = CommonDialog1.FileName
                   
'打开文件
                   MMControl1.Command = "open "
                
Case 4  '选择*.mid
                   '设置多媒体设备类型为waveaudio
                   MMControl1.DeviceType = "waveaudio"
                   
'设置时间格式为帧
                   MMControl1.TimeFormat = 3
                   
'设置播放的文件为通用对话框中选择的文件
                   MMControl1.FileName = CommonDialog1.FileName
                   
'打开文件
                   MMControl1.Command = "open "
            
End Select
            
'设置hwnddisplay的值,使媒体文件能够在picture控件中播放
            MMControl1.hWndDisplay = Picture1.hWnd
             
 
End Sub

        (二)新建、修改、删除目录
         以上控件除了通用对话框(CommonDialog)之外一般只能显示当前的目录结构,对于在磁盘上新建、修改、删除目录却基本无能为力。
        我们先来看看通用对话框对文件夹的新建,修改和删除操作.
            1、新建目录
            我们只要在显示出来的通用对话框的空白位置,单击鼠标,选择“新建”即可在指定的路径下创建新的目录,或者点击通用对话框右上角的新建图表(如下图所示),也可以在指定的路径下创建新的目录
            2、修改文件夹名称
            可以在显示出来的通用对话框中,用鼠标右键点击选择所要修改的文件夹,再弹出的快捷菜单中,选择重命名,即可修改目录名称。如下图所示:
            3、删除文件夹
            同修改文件夹名称一样,我们只要选择删除即可。如上图所示。
            而且这种方法比RmDir更简便,它还可以删除包含有文件和子文件夹的文件夹。
            
            除了以上控件,windows还给我们提供了一个叫做FileSystemObject(简称FSO)对象。FSO对象模型中包括了计算机文件系统所有的对象。见下表。利用这些对象可以更方便的操作文件系统。
            对象功能
                  Drive允许收集系统的驱动器信息,诸如驱动器的可用空间
                  Folder允许创建、删除或移动文件夹,并向系统查询文件夹的名称、路径等等
                  Files允许创建、删除或移动文件,并向系统查询文件的名称、路径等等
                  FileSysterObject此为主要对象,提供一整套用于创建、删除、搜集相关信息,以及通常的操作驱动器,文件夹,和文件的方法。
                  TextStream允许读写文本文件

           下面我们一起来看看怎样用FSO对象来显示、新建、修改以及删除目录。
            FSO对象模型包含在Scripting的类型库中,此类型库存在于Scrrun.dll文件中.使用FSO对象模型,首先要建立一个FileSystemObject对象.有两种方法可以实现.一种是从”工程”菜单中的”引用”对话框选择”Microsoft      Scripting Runtime”项,然后在代码窗口中声明一个FileSystemObject类型的变量.语句如下:
                Dim fso As New FileSystemObject
            另一种方法是在代码中使用CreatObject方法动态的创建一个FileSystemObject对象.语句如下:
               Dim fso As  Object ‘ 声明对象变量
               Set fso = CreatObject(“Scripting. FileSystemObject”)  ‘创建FSO对象
            我们具体看看FileSystemObject的主要属性.
            1、驱动器
            (1)  Drives属性是FileSystemObject对象的唯一属性,它返回Drives集合中所有可用驱动器的只读集合。对于可删除的驱动器,不需要将媒体插入其中,就可以在Drives集合中显示出来。下面是它的主要属性有两个:一个是Count,另一个是Item.Count属性返回Drives集合或Dictionary对象中的条目数.Item属性用来返回或设置Drives集合或Dictionary对象中与指定关键字相关的项目.
            下面代码说明了如何获得Drives集合,以及如何用For Eacn……Next语句来访问该集合中的每个Drive:

Sub ShowDriveList()
            
Dim fs As Object, d, dc, s,n  
            ‘创建文件系统对象
            
Set fs = CreatObject(“Scripting. FileSystemObject”)
            ‘创建驱动器集合
            
Set dc= fs.Drives
            ‘取的驱动器对象
            
For Each d in dc
               s 
= s & d.DriveLetter & “-” ‘格式化文本
               
If d.DriverType = Remote Then   ‘如果是Remote类型的驱动器
                  n 
= d.ShareName        ‘取得它的共享名
               
Else
                  n 
= d.volumeName     ‘否则取得它的卷标
               
End if
               s
= s& n & vbCrLf      ‘格式化文本
            
Next
            
MsgBox s          ‘显示文本
End sub

           (2) 当然我们也可以用Drive对象.Drive对象提供了对磁盘驱动器或网络共享属性的访问方法.下面是它的主要属性及其解释:             
              Availablespace驱动器已用空间DriveLetter驱动器指定的字母
              Freespace驱动器剩余空间DriverType驱动器类型
              TotalSize驱动器全部空间FileSystem驱动器文件系统
              IsReady驱动器是否已准备Path驱动器根目录
              SerizlNumber驱动器序列号VolumeName驱动器卷标
              ShareName驱动器共享名              
          主要的方法就是GetDrive,此方法用来访问一个已有的驱动器,该方法返回一个与指定路径中的驱动器相对应的Drive对象。下面的代码中,我们将说明怎样取得一个指定的驱动器的相关信息:

Sub ShowFreeSpace(drvPath)     ‘显示指定目录下的驱动器的信息
              Dim fs As Object, d, s      
              Set fs 
= CreateObject("Scripting.FileSystemObject") ‘创建文件系统对象
              Set d 
= fs.GetDrive(fs.GetDriveName(drvPath))  ‘创建并得到指定取目录下的驱动器
              s 
= "Drive" & UCase(drvPath) & "-"   ‘格式化文本
              s 
= s & d.VolumeName & vbCrLf   ‘得到驱动器的卷标
              s 
= s & "FreeSpace:" & FormatNumber(d.FreeSpace / 10240)  
            ‘计算驱动器的剩余磁盘空间
              s 
= s & "Kbytes"
              MsgBox s    ‘显示
End Sub

        下面是filesystemobject的其他方法
             CreateFolder该方法的作用是创建一个文件夹。所要创建的文件夹必须是不存在的,否则出错。
             CreateTextFile该方法的作用是产生一个指定的文件名,并返回一个TextStream对象,该对象可被用于对指定的文件进行读写。如果overwrite参数为False或未指定,对于一个已存在的文件,将产生错误。
             DeleteFile该方法的作用是删除一个指定的文件。如果指定的文件不存在,则出错。
             DeleteFolder该方法的作用是删除一个文件夹及其内容。如果没有发现匹配的文件夹则出错。该方法不能确定文件夹中是否包含内容。
             DriveExists该方法的作用是用来确定驱动器是否存在。如果指定的驱动器存在,则返回True,否则返回False。但对于可删除介质的驱动器,即使没有介质存在,DriveExists方法也返回True,因此最好使用IsReady属性确定驱动器是否准备就绪。
             FileExists该方法的作用是判断指定的文件对象是否存在于当前文件夹
             FolderExists该方法的作用是判断指定的文件夹对象是否存在于当前文件夹
             GetDrive该方法的作用是返回一个在指定路径中的与某个驱动器相对应的Drive对象。对于网络驱动器,将首先检查该共享是否存在。
             GerDriveName该方法的作用是返回包括某一指定路径上的驱动器名的字符串。如果驱动器不能确定,则返回一个0长度字符串。该方法只对指定的路径起作用,它并不试图解析路径,也不检查指定路径是否存在。
             GetExtensionName该方法的作用是返回指定路径中最后一个组成部分的扩展名。
             GetFile该方法的作用是返回指定路径中与某一文件相关的File对象。一定要保证所指定的文件是实际存在的。否则将产生错误。
             GetFileName该方法的作用是返回指定路径的最后一个组成部分的文件名。
             GetFolder该方法的作用是返回指定路径上的与某个文件夹相关的Folder对象.要保证指定的文件夹是实际存在的,否则会出错.     使用Folder对象的第一部就是先用FileSystemObjectd的GetFolder方法得到Folder对象
                  GetParentFolderName该方法的作用是返回一个包含指定路径上的最后一个组成部分的父文件夹的名称。
                  MoveFile该方法的作用是将一个或多个文件从一个地方移动到另一个地方。
                  MoveFolder该方法的作用是移动一个或多个文件夹,如果源路径包含通配符,或目的路径以斜杠(/)为结束,则表明目的路径为已存在的路径,在此文件夹中移动相匹配的文件夹.否则,认为目的路径是一个要创建的目标文件夹的名字.如果目的路径为一个已存在的文件或目的路径为一个目录,则出错.如果没有任何文件与源路径中的通配符相匹配也出错.
                  OpenTextFile该方法可用来打开一个指定的文件,并返回一个TextStream对象。用于读文件或追加文件。             
           2、文件夹
               对文件夹的操作,我们可以使用folder对象,它提供了对文件夹所有属性和方法的访问.下表市对其主要属性的解释:            
                  DateCreated返回指定文件或文件夹的创建日期和时间
                  DateLastAccessed返回最后一次访问指定文件或文件夹的日期和时间
                  Drive返回指定文件或文件夹所在的驱动器符号
                  Files返回由File对象组成的所有Files集合,这些Files集合包含在指定的文件夹中,包括设置了隐藏和系统文件属性的那些文件夹
                  IsRootFolder如果指定的文件夹是根文件夹,则返回True,否则返回False
                  Name设置或返回指定文件或文件夹的名称
                  ParentFolder返回指定文件或文件夹的父文件夹的Folder对象
                  Path返回指定文件、文件夹或驱动器的路径
                  ShortName返回较早的需要8.3文件命名约定的程序所使用的短文件名
                  ShortPath返回较早的需要8.3文件命名约定的程序所使用的短路径
                  Size对文件来说,本属性返回以字节为单位的文件大小;对文件夹来说,返回以字节为单位包括其中所有文件或子文件夹的大小
                  SubFolders返回包含所有文件夹的一个Folders集合,这些文件夹包含在某个特定文件夹中,  包括设置了隐藏和系统文件属性的那些文件夹
                  Type返回指定文件或文件夹的类型信息.            
            使用Folder对象的第一部就是先用FileSystemObjectd的GetFolder方法得到Folder对象, 该方法的作用是返回指定路径上的与某个文件夹相关的Folder对象.要保证指定的文件夹是实际存在的,否则会出错.
            
            让我们来看一看其中的各种属性及其用法吧.
            (1)Attributes属性可以返回文件或文件夹的属性,或者设置他们的新属性.所设属性可以是以下值中任意一个或多个的逻辑组合.             
                  常数值说明
                  Normal0为一般文件,不设置属性
                  ReadOnly1为只读文件,属性为读/写
                  Hidden2为隐藏文件,属性为读/写
                  System 4为系统文件,属性为读/写
                  Volume8为磁盘驱动器卷标,属性为只读
                  Directory16为文件夹或目录,属性为只读
                  Archive32在上次备份后已经改变的文件,属性为读/写
                  Alias64为链接或快捷方式,属性为只读
                  Compressed128为压缩文件,属性为只读             
            (2)DateCreated属性返回指定文件或文件夹的创建日期和时间,本属性为只读属性.
            下面是用法:

Sub ShowFolderList( folderspec )  ‘folderspec 为文件夹名称
               
Dim fs , f, f1,fc , s
               
Set fs = CreateObject(“Scripting.FileSystemObject”)
               
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
               
Set fc = f.SubFolders ‘得到folder对象所包含的文件夹的folder集合
               
For Each fi in fc      ‘访问folder集合中的每一个folder
            s
= s &  f1.name       ‘格式化要显示的文本
            s
= s & vbCrLf
               
Next  
               
MsgBox s   ‘用对话框显示信息
End Sub

        (3)DateLastModified属性用来返回最后一次修改指定文件或文件夹的日期和时间,本属性为只读.
            下面代码用一个文件举例说明了DataLastModified属性的用法:

Sub ShowFileAccessInfo(filespec)
            
Dim fs,f,s
            
Set fs = CreateObject(“Scripting.FileSystemObject”)
                
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
            s
= Ucase(filespec) & vbCrLf
            s
= s& “Created:” & f.DateCreate & vbCrLf
            s
= s & “Last Accessed :” & f.DateLastAccessed & vbCrLf
            s
= s & “Last Modifide :” & f.DateLastModified
            
MsgBox s, 0,”File Access Info”
End Sub

        (4)Type属性返回关于某个文件或文件夹类型的信息.例如对于以.TXT结尾的文本文件来说,本属性会返回”Text
            Document”.下面的代码举例说明了返回某个文件夹类型的Type属性的用法.在这个示例中,试图将Recycle
            Bin的路径或其他唯一的文件夹提供给过程.

Sub ShowFileSize( filespec )
            
Dim fs,f,s
            
Set fs = CreateObject(“Scripting.FileSystemObject”)
                
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
            S 
= Ucase(f.Name) & “is a ” & f.Type    ‘格式化文本
            
MsgBox s,o, “File Size Info ”       ‘显示信息
End Sub

       主要方法有:
            (1)Copy方法:
            该方法的作用是拷贝一个指定的文件或文件夹到指定的目录.该方法和FileSystemObject.CopyFile方法的作用相同             
            (2)CreateTextFile方法:               
            该方法的作用是产生一个指定的文件名,并返回一个TextStream对象,该对象可被用于对指定的文件进行读写.如果overwrite参数为False或未指定,对于一个已存在的文件,将产生错误.               
            (3)Delete方法:               
            该方法的作用是删除一个指定的文件或文件夹.如果指定的文件或文件夹不存在,则发生一个错误.对于一个File或Folder来说,Delete方法的运行的结果和执行FileSystemObject.DeleteFile或FileSystemObject.DeleteFolder的结果是一样的.Delete方法执行时与指定的文件夹中时候有内容无关.             
            (4)Move               
            该方法用来将一个指定的文件夹或文件从一个地方移动到另一个地方,如果只是想移动一个文件或文件夹,则使用Move方法和使用FileSystemObject.MoveFile或FileSystemObject.MoveFolder操作的结果是一样的,但是如果要同时移动多个文件或文件夹,则只能使用后者.
            
            讲了这么多,还是让我们来看一下具体的实现方法:
            1、  创建一个文件夹
            可以使用FileSystemObject对象的CreateFolder方法来实现,但要创建的文件夹必须不存在,否则出错。特别注意,FileSystemObject对象不能创建或删除驱动器。
            下面的例子可以在应用程序所在目录下创建一个文件夹

Sub CreateFolder(folderspec)
            
Dim fs 
            
Set fs = CreatObject(“Scripting.FileSystemObject”)
            fs.CreaterFolder(folderspec )
End sub

            2、  删除一个或多个文件夹
            可以使用FileSystemObject对象的Deletfolder方法,或者folder对象的Delete方法

Sub DeleteFolder(folderspec)
            
Dim fs 
            
Set fs = CreatObject(“Scripting.FileSystemObject”)
            fs.DeleteFolder(folderspec 
&  “100”)
            ‘
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
            ‘f.Delete 
End sub

         3、移动一个或多个文件夹
             可以使用FileSystemObject对象的Movefolder方法,或者folder对象的Move方法

Sub MoveFolder(folderspec)
            
Dim fs 
            
Set fs = CreatObject(“Scripting.FileSystemObject”)
            fs.MoveFolder(folderspec   , “c:
windows”)
            ‘
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
            ‘f.Move(“c:
windows”)
End sub

         4、一个或多个文件夹
                 可以使用FileSystemObject对象的Copyfolder方法,或者folder对象的Copy方法。

Sub CopyFolder(folderspec)
            
Dim fs 
            
Set fs = CreatObject(“Scripting.FileSystemObject”)
            fs.CopyFolder(folderspec   , “c:
windows”)
            ‘
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
            ‘f.Copy(“c:
windows”)
End sub

 

         二、使用visual basic所提供的语句对目录操作
            1、创建一个新目录或文件夹
            实现这一步我们可以使用vb中的MkDir语句。
            格式:MkDir  path
            作用:创建一个新的目录和文件
            说明:path
            指定所要创建的目录或文件夹的字符串表达式。Path可以包含驱动器。如果没有指定驱动器,则MkDir会在当前驱动器上创建新的目录或文件夹。如果指定的目录或文件夹已经存在,那么就会产生一个错误。
            例如: MkDir “c:/windows/100”
            
            2、修改目录名
            vb中提供了一个Name语句可以实现这些功能。
            格式:  Name  oldpathname  As newpathname
            作用: 从命名一个文件、目录或文件夹。
            说明: 
            oldpathname字符串表达式,指定已存在的文件名和位置,可以包含目录或文件夹以及驱动器名。newpathname字符串表达式,指定新的文件名和位置,可以包含目录或文件夹以及驱动器名。并且oldpathname和newpathname必须位于同一个驱动器上。如果newpathname指定的路径存在但不同于oldpathname指定的路径,则Name语句会将文件移动到新的目录或文件夹,并在必要时从新命名文件.如果newpathname和oldpathname路径不同而文件名相同,那么Name只会移动文件到新的位置,并保持文件名不变.
                   
            Name语句可以将文件从一个目录或文件夹移动到另一处,但无法移动目录或文件夹.而且不能在一个已经打开的文件上使用Name,否则会产生错误.因此在改变名称之前,一定要关闭文件.Name参数中不能包括多字符(*)和单字符(?)的通配符.
            例如:Name “c:/windows/100” As “c:/windows/200”
            
            3、删除目录
            
            对于删除目录,我们可以使用RmDir语句
            格式:RmDir  path
            作用:删除一个目录或文件夹。
            说明:path
            指定所要删除的目录或文件夹的字符串表达式。Path可以包含驱动器。如果没有指定驱动器,则RmDir会在当前驱动器上删除目录或文件夹。如果想要使用RmDir删除一个含有文件的目录或文件夹,则会发生错误。只有用Kill语句删除所有文件后,才能用来RmDir删除目录或文件夹。
            例如:RmDir “c:/windows/200”
            在此我们举一个例子看一看如何获得一个文件架下的所有子目录.下面是源代码:

Private Sub searchdir()
              
Dim spath As String, sdir As String
              
Dim booldir As Boolean '是否有子目录的标志
              booldir = False  '初始化标志
              spath = Dir1.Path  '选择路径
              If Right(spath, 1<> "" Then  '判断路径最后是否以结尾
                   spath = spath & ""    '不是,则加上
              sdir = Dir(spath & "*.*", vbDirectory) '得到当前路径下的所有文件和目录
              While sdir <> ""   '如果不为空
                  If sdir <> "." And sdir <> ".." Then '并且不是这两种文件夹
                      booldir = True      '那么,该目录下有子目录
                      MsgBox "该目录下有子目录:" & sdir   '显示信息
                  End If
                  sdir 
= Dir()
              
Wend
              
If Not booldir Then   '标志为假,该目录下没有子目录
                  MsgBox "该目录下没有子目录"
              
End If
End Sub

 

        三、使用windows提供的API函数
            下面是windows中提供的对于目录进行操作的API函数及其功能:
                  CreateDirectory, CreateDirectoryEx创建一个新目录
                  GetCurrentDirectory在一个缓冲区中装载当前目录
                  GetDiskFreeSpace,
                  GetDiskFreeSpaceEx获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
                  GetDriveType判断一个磁盘驱动器的类型
                  GetFullPathName获取指定文件的完整路径名
                  GetLogicalDrives判断系统中存在哪些逻辑驱动器字母
                  GetLogicalDriveStrings获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径
                  GetSystemDirectory这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作
                  GetTempPath获取为临时文件指定的路径
                  GetVolumeInformation获取与一个磁盘卷有关的信息
                  GetWindowsDirectory这个函数能获取Windows目录的完整路径名。在这个目录里,保存了大多数windows应用程序文件及初始化文件
                  RemoveDirectory删除指定目录
                  SetCurrentDirectory设置当前目录
                  SetVolumeLabel设置一个磁盘的卷标(Label)

            让我们通过几个例子来详细的了解一下其中主要的几个函数及其用法:
            1、GetLogicalDrives
            作用:判断系统中存在哪些逻辑驱动器字母
            声明形式:Declare Function GetLogicalDrives Lib "kernel32" Alias  "GetLogicalDrives" () As Long
            说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推
            2、GetDriveType
            作用:判断一个磁盘驱动器的类型
            声明形式:Declare Function GetDriveType Lib "kernel32" Alias  "GetDriveTypeA" (ByVal nDrive As String) As Long
            说明:此函数的返回值类型为Long,如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型:DRIVE_REMOVABLE(表示磁盘可以从驱动器上移走,通常是软驱), DRIVE_FIXED(磁盘不能从驱动器上移走,通常为本地硬盘), DRIVE_REMOTE(驱动器是远程网络驱动器), DRIVE_CDROM(驱动器是CD-ROM驱动器) 或 DRIVE_RAMDISK(驱动器是RAM驱动器)
            参数为String类型,包含了驱动器根目录路径的一个字串
            下面是示例代码:

‘ 定义常数变量
            
Private Const DRIVE_CDROM = 5  ‘表示光盘驱动器
            
Private Const DRIVE_FIXED = 3    ‘表示硬盘驱动器
            
Private Const DRIVE_RAMDISK = 6  ‘表示RAM驱动器
            
Private Const DRIVE_REMOTE = 4   ‘表示网络驱动器
            
Private Const DRIVE_REMOVABLE = 2  ‘表示软盘驱动器
 函数声明
Private Declare Function GetDriveType Lib "kernel32" Alias 
            
"GetDriveTypeA" (ByVal nDrive As StringAs Long
            
Private Sub Form_Load()
              
Dim temp As Long
              temp 
= GetDriveType("e:") ‘取的e:盘驱动器类型
              
Select Case temp      ‘比较
                     
Case DRIVE_CDROM
                          
MsgBox "DRIVE_CDROM: 光盘驱动器"
                     
Case DRIVE_FIXED
                          
MsgBox "DRIVE_FIXED: 硬盘驱动器"
                     
Case DRIVE_RAMDISK
                          
MsgBox "DRIVE_RAMDISK: RAM驱动器"
                     
Case DRIVE_REMOTE
                          
MsgBox "DRIVE_REMOTE: 网络驱动器"
                     
Case DRIVE_REMOVABLE
                          
MsgBox "DRIVE_REMOVABLE: 软盘驱动器"
               
End Select
End Sub

          以上代码可以判断e:的类型。
        3、GetDiskFreeSpaceEx
            作用:获取与一个磁盘的组织以及剩余空间容量有关的信息
            声明形式:Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias  "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes  As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long
            说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError.
            在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB
            参数说明:
                  参数类型及说明
                  lpRootPathNameString,不包括卷名的磁盘根路径名
                  lpFreeBytesAvailableToCallerLARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
                  lpTotalNumberOfBytesLARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数
                  lpTotalNumberOfFreeBytesLARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数

            LARGE_INTEGER结构用来代表一个64位带符号的整数值,它的定义如下:
            Type LARGE_INTEGER ' 8 Bytes
            lowpart As Long
            highpart As Long
            End Type
            其中lowpart为 Long,指定低32位
            highpart 为 Long,指定高32位
            LARGE_INTEGER结构与FILETIME结构内部完全一致。
            请看下面示例:

Private Type LARGE_INTEGER  ' 8 Bytes,定义一个LARGE_INTEGER结构
            lowpart As Long
            highpart 
As Long
End Type

‘函数声明
           
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias  "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String,     lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes  As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long

定义变量
            
Dim RootPathName As String
            
Dim FreeBytesAvailabletoCaller As LARGE_INTEGER
            
Dim TotalNumberOfBytes As LARGE_INTEGER
            
Dim TotalNumberOfFreeBytes As LARGE_INTEGER
             
Private Sub Form_Load()
              
Dim temp As Long
              
Dim tempa, tempb, tempc
              RootPathName 
= "c:"
              ‘取得磁盘空间
              temp 
= GetDiskFreeSpaceEx(RootPathName, 
            FreeBytesAvailabletoCaller, TotalNumberOfBytes, 
            TotalNumberOfFreeBytes)
              ‘格式化文本,并显示在text控件
              Text1.Text 
= Text1.Text + "磁盘容量:" + Chr(13+ Chr(10)
             tempa 
= TotalNumberOfBytes.highpart * 65635 + 
            TotalNumberOfBytes.lowpart ‘计算容量
              tempa 
= 0 – tempa ‘我的驱动器大于2G,要得到正确的值,进行了调整
              Text1.Text 
= Text1.Text + CStr(tempa) + "字节" + Chr(13+ Chr(10)
              tempa 
= Format(tempa / 1024 / 1024 / 1024"0.00")
              Text1.Text 
= Text1.Text + tempa + "G" + Chr(13+ Chr(10)
              ‘取得磁盘可用空间
              Text1.Text 
= Text1.Text + "磁盘可用空间:" + Chr(13+ Chr(10)
             tempb 
= TotalNumberOfFreeBytes.highpart * 1000 + 
            TotalNumberOfFreeBytes.lowpart ‘计算
              Text1.Text 
= Text1.Text + CStr(tempb) + "字节" + Chr(13+ Chr(10
            ’格式化文本并显示
             tempb 
= Format(tempb / 1024 / 1024 / 1024"0.00")
             Text1.Text 
= Text1.Text + tempb + "G" + Chr(13+ Chr(10)
              ‘取得磁盘已用空间
              Text1.Text 
= Text1.Text + "磁盘已用空间:" + Chr(13+ Chr(10)
             tempa 
= 0 – tempa  ‘调整
               tempc 
= tempa – tempb  ‘计算
               tempc 
= 0 - tempc
              Text1.Text 
= Text1.Text + CStr(tempc) + "G" + Chr(13+ 
            
Chr(10)’格式化文本,并显示
End Sub

            以上代码显示了c:上的容量,可用空间和已用空间。
        4、CreateDirectory, CreateDirectoryEx
            作用:创建一个新目录
            声明形式:Declare Function CreateDirectory& Lib "kernel32" Alias  "CreateDirectoryA" (ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES)
            Declare Function CreateDirectoryEx& Lib "kernel32" Alias        "CreateDirectoryExA" (ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes As            SECURITY_ATTRIBUTES)
            说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError
            参数说明:
                  参数类型及说明
                  lpTemplateDirectoryString,指定一个模板目录的名字,从中复制默认属性(比如目录中文件的默认压缩方式)。如设为vbNullString,则表示不使用模板
                  lpNewDirectoryString,新目录的名字
                  lpSecurityAttributesSECURITY_ATTRIBUTES,这个结构定义了目录的安全特性——如果操作系统支持的话

            示例程序代码如下:

‘定义结构
            
Private Type SECURITY_ATTRIBUTES
               nLength 
As Long
               lpSecurityDescriptor 
As Long
               bInheritHandle 
As Long
            
End Type

  ‘函数声明
            
Private Declare Function CreateDirectory& Lib "kernel32" Alias  "CreateDirectoryA" (ByVal lpNewDirectory As String,             lpSecurityAttributes As SECURITY_ATTRIBUTES)
            
Private Declare Function CreateDirectoryEx& Lib "kernel32" Alias  "CreateDirectoryExA" (ByVal lpTemplateDirectory As String, ByVal  lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES)
             
Private Sub form_load()
              
Dim temp As SECURITY_ATTRIBUTES
              CreateDirectory 
"c: est", temp  ‘创建文件夹
End Sub

            以上代码在c:下创建一个名为test的文件夹
        5、RemoveDirectory
            作用:移除一个目录
            声明形式:Declare Function RemoveDirectory Lib "kernel32" Alias  "RemoveDirectoryA" (ByVal lpPathName As String) As Long
            说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError.
            在调用这个函数前,目录必须为空
            参数说明:
                  参数类型及说明
                  lpPathName为String类型,要删除的那个目录的名字

            示例代码如下:

‘函数声明
            
Private Declare Function RemoveDirectory Lib "kernel32" Alias  "RemoveDirectoryA" (ByVal lpPathName As StringAs Long
           
 
Private Sub form_load()
              
Dim temp As String
              temp
= “c:test”
              RemoveDirectory temp  ‘移除文件夹
End Sub

            以上代码删除c:下一个名为test的文件夹。
         6、SetCurrentDirectory
            作用:设置当前目录
            声明形式:Declare Function SetCurrentDirectory Lib "kernel32" Alias  "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
            说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError
            参数说明:
                  参数类型及说明
                  LpPathNameString,新当前目录的路径

            示例代码如下:

‘函数声明
            
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias  "SetCurrentDirectoryA" (ByVal lpPathName As StringAs Long

 
Private Sub form_load()
              SetCurrentDirectory 
"c:"  ‘设置当前目录
 
End Sub

            以上代码将c:设置为当前目录
        7、GetSystemDirectory
            作用:这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作
            声明形式:Declare Function GetSystemDirectory Lib "kernel32" Alias  "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
            说明:此函数的返回值类型为Long,装载到lpBuffer缓冲区的字符数量。如lpBuffer不够大,不能容下文件名,则返回要求的缓冲区长度
            参数说明:
                  参数类型及说明
                  lpBufferString,用于装载系统目录路径名的一个字串缓冲区。它应事先初始化成nSize+1个字符的长度。通常至少要为这个缓冲区分配MAX_PATH个字符的长度
                  nSizeLong,lpBuffer字串的最大长度

            示例代码如下:

‘函数声明
            
Private Declare Function GetSystemDirectory Lib "kernel32" Alias  "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As  LongAs Long
           
 
Private Sub form_load()
              
Dim buffer As String
              
Dim size As Long
              size 
= 255
              buffer 
= size + 1
              GetSystemDirectory buffer, size  ‘将系统路径存放在buffer中
              
MsgBox buffer   ‘显示路径
 
End Sub
           以上代码获取了windows系统目录的完整路径。
             
       第二部分  文件操作
         文件可以永久的存储信息。应用程序中如果想长期保存和访问数据,就必须将数值存储到文件中。这些文件主要包括顺序文件、随机文件、二进制文件。
         顺序文件就是普通的文本文件,任何文本编辑器都可以读写这种文件。读写顺序文件时,每次只能按顺序读写一行,每行的长度可以变化。顺序文件一般用于存储字符、数字或者其他可用ASCII字符表示的数据类型,但不能存储像位图之类的信息,这些信息应该用二进制方式表示。
            随机文件时可以按任意次序读写的文件,每行或者每个记录的长度是固定的。随机文件的操作与顺序文件有些不同。使用顺序文件,只需要随便指定一个变量来存储数据项的内容就可以了,不必担心数据项的字符串会过长;而使用随机文件时,因为文件中的每个记录都是等长的,因此用于保存数据的变量必须与文件中的记录类型一致。
         二进制文件存放的时字节信息,适用于存放任意结构的数据。从二进制文件可以察看指定字节的内容,它是唯一支持到任意位置读写任意长度数据的文件类型。
        除了以上分法,文件还以不同的存储格式分为后缀名不同的文件。
            一、使用现成的控件
            (一)显示文件
            因为不同文件的存储格式的差异,所以,只有用适当的方法才能正确的显示不同的文件。表现在表层,也就是不同的文件后缀名不同,而且不同的应用软件只能读取和显示某种或几种不同格式的文件。如:以.DOC为后缀名的文件,用WORD就可以打开,但是用记事本就无法正确显示.所以,VB中就给我们提供了不同的控件来显示不同的文件。
            在此我们以text控件为例子,看一看用它是怎样显示文件的。
Private Sub mnuopen_Click()  ’当点击菜单中的打开文件时执行
            
Dim filepath as Sting
            
Dim strLine As String
            
'在未选择文件时,text.text为空字符,,不显示任何内容
                text1.text = “”
            CommonDialog1.FileName 
= ""
            
'下面语句设置文件过滤方式,可显示扩展名为txt文件
            CommonDialog1.Filter = "(*.txt)|*.txt"
            
'建立打开方式的通用对话框,也可使用commondialog1.showopen
            CommonDialog1.Action = 1
            filepath
=CommonDialog1.FileName ‘得到选择的文件
            Open filepath 
For Input As #1    打开选择的文件
            
Do Until EOF(1)      ‘显示打开的文件
                    Line Input #
1, strLine
                    text1.Text 
= text1.Text + strLine + Chr(13+ Chr(10)
            
Loop
            Close #
1 ‘关闭打开的文件
End Sub

         除了vb自带的控件外,我们还可以使用fileSystemObject文件系统对象,file对象,以及files集合。下面我们给出两个例子,更多更详细的内容请参考前面目录部分。
            下面代码举例说明了如何获得一个file对象,以及如何察看它的一个属性。

Sub ShowFileInfo(filespec)
              
Dim fs, f, s
              
Set fs = CreateObject("scripting.FileSystemObject")
              
Set f = fs.GetFile(filespec)
              s 
= f.DateCreated
              
MsgBox s
End Sub

        对于如何获得一个files集合,以及如何用For Each……Next语句来访问这个集合中的每个file,我们可以参考下面的例子: 

Sub ShowFolderList( folderspec )  ‘folderspec 为文件夹名称
               
Dim fs , f, f1,fc , s
               
Set fs = CreateObject(“Scripting.FileSystemObject”)
               
Set f = fs.GetFolder(folderspec) ‘得到folderspec文件夹相关的folder对象
               
Set fc = f.Files ‘得到folder对象所包含的文件夹的files集合
               
For Each fi in fc      ‘访问folder集合中的每一个folder
              s
= s &  f1.name       ‘格式化要显示的文本
              s
= s & vbCrLf
               
Next  
               
MsgBox s   ‘用对话框显示信息
End Sub

            现成的控件一般只能显示文件,如果要进行更多的操作,请看下面的内容。
     二、使用VisualBasic提供的语句
        (一)打开和关闭文件
         1、顺序文件
            打开顺序文件,我们可以使用Open语句。它的格式如下:
            Open  pathname  For [Input |Output |Append] As [#]filenumber [Len =
            buffersize]
            说明:  (1)参数pathname 表示要打开的文件名,文件名可以包含有驱动器和目录
             (2)Input Output
            和Append用于设置顺序文件的打开方式。其中,Input表示从打开的文件中读取数据。以这种方式打开文件时,文件必须存在,否则会产生错误。Output表示向打开的文件中写入数据。以这种方式打开文件时,文件中原有的数据将被覆盖,新的数据将从文件开始写入。如果文件不存在,则创建一个新文件。Append表示向打开的文件中添加数据。以这种方式打开时,文件中原有的数据将被保留,新的数据将从文件为开始添加。如果文件不存在,则创建一个新文件。
             (3)As[#]filenumber
            子句用于为打开的文件指定文件号.对文件进行读写操作时,要用文件号表示该文件.文件号是介于1~511之间的整数,既可以是数字,又可以是变量.也可以省略不用.
            (4)当在文件与程序之间拷贝数据时,Len=buffersize子句指定缓冲区的字符数.
            例如: Open App.Path + "/test.dat" For Output As 1
                      Open App.Path + "/test.dat" For Output As 1
            这两句代码在当前应用程序所在目录下创建了一个名为test.dat的文本文件,分配文件号为1.
                      Open App.Path + "/test.dat" For Input As [#]filenumber
            这条语句是从文本文件中读取数据.
                      Open App.Path + "/test.dat" For Append As [#]filenumber
            这条语句则是像文本文件中添加数据
         2、随机文件
            操作随机文件之前,首先必须定义用于保存数据项的记录类型.该记录是用户自定义数据类型,他们是随机文件中存储数据的基本结构.例如:
            
            Type Student
               No As Integer
               Name As String * 20
               age As Integer
            End Type
            
            Dim Stud As Student  ‘定义一个可以存放学生材料的变量
            随机文件中,所有的数据都将保存到若干个结构为Student类型的记录中, 而从随机文件中读出的数据则可以存放到变量Stud中.
            之后我们就可以打开并读写文件了.下面是打开随机文件的语法格式:
            Open filename For Random as [#]filenumber Len = Reclength
            说明: (1)参数filename 和filenumber 分别表示文件名或文件号.
            (2)关键字Random 表示打开的是随机文件
            (3)Len子句用于设置记录长度,长度由参数Reclength指定.Reclength的值必须大于0,而且必须与定义的记录结构的长度一致.计算记录长度的方法是将记录结构中每个元素的长度相加.例如前面声明的Student的长度应该是2+20+2=24字节.
            打开一个记录类型为Student 的随机文件的方法是:
            Open "c:/Student.txt " For Random As #1 Len = 25
        3、二进制文件
               打开二进制文件的语法格式如下:
             Open pathname For Binary As [#]filenumber
            说明:(1) 参数filename 和filenumber 分别表示文件名或文件号.
             (2)关键字Binary 表示打开的是二进制文件               
             (3)对于二进制文件,不能指定字节长度.每个打开的二进制文件都有一个自己的指针,文件指针是一个数字值,指向下一次读写操作的文件中的位置.二进制文件中的每个”位置”对应一个数据字节,因此,有n个字节的文件,就有1到n个位置.
            我们可以用Seek()函数返回当前的文件指针位置(即下一个要读写的字节);用Loc()函数返回上一次读写的字节位置,除非用Seek语句移动了指针,Loc()返回值总比Seek()的小1.我们来看下面的例子:
            Open “student.txt”  for Binary as #1
            该语句用二进制的方式打开了student.txt文件.
            
            (二)读文件
            1、顺序文件
            顺序文件的读取有三种方式:
            (1)Line Input # 语句
            该语句从打开的顺序文件中读取一行数据。这里的一行指的是从当前指针位置开始到回车符或回车换行符之间的所有数据。Line Input #
            语句的语法格式如下:
            Line Input # 文件号,变量号
            说明:“文件号”是打开文件时所用的文件号;“变量号”使用来存放读出数据的一个或多个变量,如果有多个变量,中间用空格分割开。Input#
            语句为参数列表中的每一个变量读取文件的一个域,并将读出的域存入变量中。该语句只能顺序的从第一个域开始,直到读取想要的域。
            请看下面代码:
            Dim strLine As String
            Open "c:/vb/test.txt" For Input As #1
            Do Until EOF(1)
               Line Input #1, strLine
               text1.Text = text1.Text + strLine + Chr(13) + Chr(10)
            Loop
            Close #1
            此段代码逐行读取一个文件到文本框中。
            (2)Input函数
            此函数可以从顺序文件中一次读取指定长度的字符串。具体地说,就是从文件的当前位置开始,读取指定个数的字符,然后将他们返回。Input函数可以读取包括换行符,回车符,空格符等在内的各种字符。下面是它的语法格式:
            变量 = Input(串长度,文件号)
            例如,要从一个打开文件中读取12个字符并复制到变量file中,我们可以这样写:
            file = Input(12,filenum)
            如果要将整个文件复制到变量,请使用InputB函数将字节从文件复制到变量。由于InputB函数返回一个ASCII字符串,因此,必须用StrCopy函数将ASCII字符串转换为Unicode字符串。代码如下:
            file = StrCopy (Input (LOF(filenanum),filenum),vbUnicode)
            (3)Input # 语句
            Input #语句可以从文件中同时向多个变量内读入数据,而且读入的数据可以是不同类型的。
            下面使它的语法格式:
            Input # 文件号,变量列表
            例如,我们要在文件student.txt中写入数据,下面是代码:

            Open "student.txt" For Output As #filenum
            Write #filenum, 
"张三""初一年级"14
            Write #filenum, 
"李四""职业高中"18
             
            
Dim name As String, nianji As String, age As Integer
            
Dim name1 As String, nianji1 As String, age1 As Integer
            Open 
"student.txt" For Input As #filenum
            Input #filenum, name, nianji, age
            Input #filenum, name1, nianji1, age1
            Close #filenum
             
            执行结果:
            name
=”张三” ,nianji = “初一年级” ,age =14   
            name
=”李四” ,nianji = “职业高中” ,age =18  

        2、随机文件
            读取随机文件是可以使用Get # 语句,数据从文件的一个指定记录中读出后,存入一个用户自定义的变量中.
            语法格式: Get # FileNum ,[RecNum],UserType
            说明: (1)FileNum 是要打开的文件号;RecNum是要读取的记录号,若省略,则读取下一个记录
            (2)UserType 是一个用来存放读出数据的用户自定义的数据类型变量.
            下面是一个例子:
            Get # 1,5,Student 
            该语句读取文件号为1的文件中的第5条记录.
        3、二进制文件
            读写二进制文件的方法和读写随机文件的方法基本相同,下面是相关的语句格式及其说明:
            格式:  Get [#]fileNumber ,[Pos], Var
            功能: 用二进制方式,从文件的中指定的位置开始读取,所给变量长度的数据
            说明: (1)FileNumber是以二进制方式打开的文件号.
            (2)Pos用来指定读写操作发生时的字节位置,若省略,则使用当前文件指针位置.
            (3)Var是用来存放读出的数据的变量.该语句会自动根据var变量包含的字节长度读取适当的文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数.对于文件长度的判断我们可以使用Lof()函数,Eof()函数检查文件的结尾位置.
            下面的代码复制studert.txt文件到student1.txt文件中
            Dim ar As String * 1, i As Integer
            Open "c:/student.txt" For Binary As #1
            Open "c:/student2.txt" For Binary As #2
            For i = 1 To LOF(1)
               Get #1, , ar
               Put #2, , ar
            Next i
            Close #1, #2
             
      (三)写文件
          1、  顺序文件
             写顺序文件我们可以用Write # 和Print #语句向一个已经打开的文件中写入数据.
            下面是他们的格式和说明:
              Print # 的语法格式:
              Print # 文件号,变量列表
            例如,将文本框中的文本写到文件中,代码如下:
            Open "file.txt" For Output As #filenum
            Input #filenum, text1.text
            
            Write # 语句的语法格式:
                   Write # 文件号,变量列表
            说明:用Write # 语句写入的信息便于以后用Input #语句来读取数据,因为Write
            #语句自动将写入到文件中的信息用逗号分开,并为字符串数据加上双引号.例如:
            Open "student.txt" For Output As #filenum
            Write #filenum, "张三", "初一年级", 14
            Write #filenum, "李四", "职业高中", 18
             
        2、  随机文件
            向随机文件中写入数据,使用Put #语句.语法格式如下:
            Put [#] FileNum ,[RecNum],UserType
            说明: (1) FileNum 是要打开的文件号;RecNum是要写入的记录号,若省略,则再上一次用Get
            和Put语句所读写过的记录的后一条记录中写入,如果没有执行过Get 和Put语句,就从第一条记录开始
            (2)UserType
            是包含要写入数据的用户自定义的数据类型变量.例如:我们向前面的student.txt文件中的第5个记录写入数据,可用这些语句:
            stud.No = 0301
            stud.Name = “王武”
            stud.Age =20
            Put #1 ,5,stud
            如果要插入的数据不只一两条的话,首先要确定文件和每条记录的长度,这样就可以计算出文件中究竟有多少条记录.我们可以用Lof()函数返回文件的长度,Len()函数返回每个记录的长度,计算文件中的记录个数可以用文件的长度除以给个记录的长度.示例如下:
            Nextrec= (Lof(1)/Len(UserType))+1
            Put #1,Nextrec,UserType
         3、二进制文件
            下面是以二进制方式写入文件的语句格式及其说明:
            格式:  Put [#]fileNumber ,[Pos], Var
            功能: 用二进制方式,从文件的中指定的位置开始写入,所给变量长度的数据
            说明: (1)FileNumber是以二进制方式打开的文件号.
            (2)Pos用来指定写操作发生时的字节位置,若省略,则使用当前文件指针位置.
            (3)Var是用来存放写入的数据的变量.该语句会自动根据var变量包含的字节长度写入文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数.
            使用方法可参考二进制文件的读操作.

      三、使用windows提供的API函数
         下面是windows中提供的对于文件进行操作的API函数及其功能:
             CloseHandle关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。涉及文件处理时,这个函数通常与vb的close命令相似。应尽可能的使用close,因为它支持vb的差错控制。注意这个函数使用的文件句柄与vb的文件编号是完全不同的
                  CompareFileTime根据FILETIME结构的信息,对比两个文件的时间
                  CopyFile复制文件。与vb的filecopy命令相似
                  CreateFile这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台
                  DeleteFile删除指定文件
                  FindClose关闭由FindFirstFile函数创建的一个搜索句柄
                  FindFirstFile根据文件名查找文件
                  FindNextFile根据调用FindFirstFile函数时指定的一个文件名查找下一个文件
                  FlushFileBuffers针对指定的文件句柄,刷新内部文件缓冲区
                  GetBinaryType判断文件是否可以执行
                  GetFileAttributes判断指定文件的属性
                  GetFileInformationByHandle这个函数提供了获取文件信息的一种机制——在一个BY_HANDLE_FILE_INFORMATION结构中装载与文件有关的信息
                  GetFileSize判断文件长度
                  GetFileTime取得指定文件的时间信息
                  GetFileType在给出文件句柄的前提下,判断文件类型
                  GetFileVersionInfo从支持版本标记的一个模块里获取文件版本信息
                  GetFileVersionInfoSize针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区
                  GetShortPathName获取指定文件的短路径名
                  GetTempFileName这个函数包含了一个临时文件的名字,它可由应用程序使用
                  lclose关闭指定的文件,请参考CloseHandle函数,了解进一步的情况
                  lcreat创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,以便读写
                  llseek设置文件中进行读写的当前位置。该函数与vb的seek语句类似。如果用vb的open命令打开了一个文件,那么不要再对这个文件使用llseek函数
                  LockFile在windows中,文件可用共享模式打开——在这种情况下,多个进程可同时访问该文件。利用这个函数,要对文件进行读写的一个应用程序可将文件的某一部分锁定起来,使其不能由其他应用程序访问。这样便避免了同时读写时发生的冲突
                  LockFileEx与LockFile相似,只是它提供了更多的功能
                  lopen以二进制模式打开指定的文件
                  lread将文件中的数据读入内存缓冲区
                  lwrite将数据从内存缓冲区写入一个文件
                  MoveFile, MoveFileEx移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx
                  OpenFile这个函数能执行大量不同的文件操作。和这个函数相比,请优先考虑win32的CreateFile函数(它能打开命名管道和控制Unicode文件名,同时不受128个字符的路径名称的限制)
                  ReadFile从文件中读出数据。与lread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽
                  ReadFileEx与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
                  SearchPath查找指定文件
                  SetEndOfFile针对一个打开的文件,将当前文件位置设为文件末尾
                  SetFileAttributes设置文件属性
                  SetFilePointer在一个文件中设置当前的读写位置
                  SetFileTime设置文件的创建、访问及上次修改时间
                  UnlockFile解除对一个文件的锁定
                  UnlockFileEx解除对一个文件的锁定
                  WriteFile将数据写入一个文件。该函数比lwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理
                  WriteFileEx与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调

            让我们通过几个例子来详细的了解一下其中主要的几个函数及其用法:
            1、CreateFile
            作用:这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台
            声明形式:Declare Function CreateFile Lib "kernel32" Alias "CreateFileA"  (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As CURITY_ATTRIBUTES,
ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As
            Long, ByVal hTemplateFile As Long) As Long
            说明:此函数的返回值类型为Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS
            或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
            打开一个通信端口时(如COM1),无论如何都要设置成 OPEN_EXISTING
            这个函数代替了lOpen 和 lCreate函数,应该是我们的首选
            参数说明:
                  参数类型及说明
                  lpFileNameString,要打开的文件的名字
                  dwDesiredAccessLong,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为
                  GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
                  dwShareModeLong,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE
                  表示允许对文件进行共享访问
                  lpSecurityAttributesSECURITY_ATTRIBUTES,指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
                  dwCreationDispositionLong,下述常数之一:
                  CREATE_NEW创建文件;如文件存在则会出错
                  CREATE_ALWAYS创建文件,会改写前一个文件
                  OPEN_EXISTING文件必须已经存在。由设备提出要求
                  OPEN_ALWAYS如文件不存在则创建它
                  TRUNCATE_EXISTING讲现有文件缩短为零长度
                  dwFlagsAndAttributesLong,一个或多个下述常数
                  FILE_ATTRIBUTE_ARCHIVE标记归档属性
                  FILE_ATTRIBUTE_COMPRESSED将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
                  FILE_ATTRIBUTE_NORMAL默认属性
                  FILE_ATTRIBUTE_HIDDEN隐藏文件或目录
                  FILE_ATTRIBUTE_READONLY文件为只读
                  FILE_ATTRIBUTE_SYSTEM文件为系统文件
                  FILE_FLAG_WRITE_THROUGH操作系统不得推迟对文件的写操作
                  FILE_FLAG_OVERLAPPED允许对文件进行重叠操作
                  FILE_FLAG_NO_BUFFERING禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
                  FILE_FLAG_RANDOM_ACCESS针对随机访问对文件缓冲进行优化
                  FILE_FLAG_SEQUENTIAL_SCAN针对连续访问对文件缓冲进行优化
                  FILE_FLAG_DELETE_ON_CLOSE关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
                  也可在Windows NT下组合使用下述常数标记:
                  SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION,
                  SECURITY_IMPERSONATION, SECURITY_DELEGATION,
                  SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
                  hTemplateFileLong,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

            示例如下:
            long hfile= CreateFile(“c://test.txt”,GENERIC_READ,
            FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
            OPEN_EXISTING,FILE_ELAG_OVERLAPPED,NULL)
            2、lcreat
            作用:创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,以便读写
            声明形式:Declare Function lcreat Lib "kernel32" Alias "_lcreat" (ByVal lpPathName As String, ByVal iAttribute As Long) As Long
            说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。如果出错,则返回HFILE_ERROR
            该函数会打开已由其他应用程序打开的文件,所以使用它时要小心。win32的CreateFile函数已取代了这个函数。这个函数与vb的open语句作用相同
            参数说明:
                  参数类型及说明
                  lpPathNameString,欲创建的文件的名字
                  iAttributeLong,下述值之一
                  0——文件能够读写
                  1——创建只读文件
                  2——创建隐藏文件
                  3——创建系统文件

            例如下面的语句打开c:/test.txt文件
            lcreat “c:/test.txt”,0
            3、lopen
            作用:以二进制模式打开指定的文件
            声明形式:Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
            说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。HFILE_ERROR表示出错。会设置GetLastError
            CreateFile函数在win32下提供了更多的功能
            参数说明:
                  参数类型及说明
                  lpPathNameString,欲打开文件的名字
                  iReadWriteLong,访问模式和共享模式常数的一个组合,如下所示:
                  1、访问模式
                  READ打开文件,读取其中的内容
                  READ_WRITE打开文件,对其进行读写
                  WRITE打开文件,在其中写入内容
                  2、共享模式(参考OpenFile函数的标志常数表)
                  OF_SHARE_COMPAT, OF_SHARE_DENY_NONE, OF_SHARE_DENY_READ,
                  OF_SHARE_DENY_WRITE, OF_SHARE_EXCLUSIVE

            4、GetFileTime
            作用:取得指定文件的时间信息
            声明形式:Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
            说明:Long,非零表示成功,零表示失败。会设置GetLastError
            如果不需要特定的信息,那么lpCreationTime,lpLastAccessTime,lpLastWriteTime都可以设置为零(用ByVal As Long)。这个函数返回的文件时间采用UTC格式
            参数说明:
                  参数类型及说明
                  hFileLong,文件的句柄
                  lpCreationTimeFILETIME,用于装载文件的创建时间
                  lpLastAccessTimeFILETIME,用于装载文件上一次访问的时间(FAT文件系统不支持这一特性)
                  lpLastWriteTimeFILETIME,用于装载文件上一次修改的时间

            示例代码如下:

‘函数声明
            
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FileTime, lpLastAccessTime As FileTime, lpLastWriteTime As FileTime) As Long
            
Private Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As LongAs Long
‘定义变量
            
Dim file As Long
            
Dim CreationTime As FileTime
            
Dim lastaccesstime As FileTime
            
Dim lastaccesstime As FileTime
‘定义结构
            
Private Type FileTime
                dwLowDateTime 
As Long
                dwHighDateTime 
As Long
            
End Type
Private Sub Form_Load()
            str1 
= "c: ext.txt"
            file 
= lopen(str1, READ_WRITE) ‘打开文件
            temp 
= GetFileTime(file, CreationTime, lastaccesstime, 
            lastwritetime)’得到文件相关信息
            
MsgBox CreationTime  ‘显示信息
End Sub

            以上代码显示文件的创建时间
            5、CopyFile
            作用:复制文件。与vb的filecopy命令相似
            声明形式:Declare Function CopyFile Lib "kernel32" Alias "CopyFileA"  (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
            说明:Long,非零表示成功,零表示失败。会设置GetLastError
            参数说明:
                  参数类型及说明
                  lpExistingFileNameString,源文件名
                  lpNewFileNameString,目标文件名
                  bFailIfExistsLong,如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。否则目标文件被改写

            示例代码如下:

‘函数声明
            
Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As LongAs Long

Private Sub Form_Load()
            CopyFile 
"c: est1.txt""c: est2.txt"1
End Sub

           以上代码将c:/test1.txt 拷贝到c:/test2.txt
            6、MoveFile, MoveFileEx
            作用:移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx
            声明形式:Declare Function MoveFile& Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String)
            Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long)
            说明:Long,非零表示成功,零表示失败。会设置GetLastError
            这两个函数通常不能将文件从一个卷移动到另一个卷。但如设置了MOVEFILE_COPY_ALLOWED标记,MoveFileEx可以做到这一点.
            参数说明:
                  参数类型及说明
                  lpExistingFileNameString,欲移动的文件名
                  lpNewFileNameString,新文件名
                  dwFlagsLong,一个或多个下述常数
                  MOVEFILE_REPLACE_EXISTING如目标文件存在,则将其替换
                  MOVEFILE_COPY_ALLOWED如移动到一个不同的卷,则复制文件并删除原来的文件
                  MOVEFILE_DELAY_UNTIL_REBOOT移动操作在系统下次重新启动时正式进行。这样便可在Windows
                  NT中改换系统文件

            示例代码如下:

‘定义结构
            
Private Const MOVEFILE_COPY_ALLOWED = &H2
            
Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4
            
Private Const MOVEFILE_REPLACE_EXISTING = &H1
 ‘函数声明
            
Private Declare Function MoveFile& Lib "kernel32" Alias "MoveFileA"  (ByVal lpExistingFileName As String, ByVal lpNewFileName As String)
            
Private Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal             lpNewFileName As String, ByVal dwFlags As Long)
            
Private Sub Form_Load()
            MoveFile 
"c: est.txt""d: est1.txt" ‘移动文件
            MoveFileEx 
"d: est1.txt""c: est.txt", MOVEFILE_REPLACE_EXISTING  
            ‘再一次移动
End Sub

            以上代码实现了文件的移动,两次移动後,文件不变
            7、DeleteFile
            作用:删除指定文件
            声明形式:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA"  (ByVal lpFileName As String) As Long
            说明:Long,非零表示成功,零表示失败。会设置GetLastError
            与vb的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除.
            参数说明:
                  参数类型及说明
                  lpFileNameString,欲删除文件的名字

            示例代码如下:

‘函数声明
            
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As StringAs Long
            
Private Sub Form_Load()
            DeleteFile 
"c: est.txt"
End Sub

以上代码删除了c:/test.txt文件
                
           

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值