对于程序,无论大到一个操作系统,小到一个单一功能的应用软件来说,很多时候,我们都要将一些数据记录和存储到磁盘中.可见,对目录和文件的操作是多么的重要.下面我们就和大家一起学习一下vb中可以应用的三种方法:1、使用现成的控件2、使用visualbasic中提供的方法3、使用windows提供的应用程序编程接口(api)。下面我们具体看看这些方法。
第一部分 目录操作
一、使用现成控件
(一) 察看和显示目录下的文件和文件夹
对于这个实现,其实很简单。首先想到的就是vb中给我们提供的现成的控件。主要有这么两类:一类是驱动器列表框(DriveListBox)、目录列表框(DirListBox)和文件列表框(FileListBox)三个控件组合而成的自定义对话框;另一类是windows提供的标准对话框。
他们在工具箱中的位置和图标如下所示:
1、驱动器列表框是一个下拉式的列表框,他和一般下拉式的列表框的不同仅在于功能上的不同,它提供了一个驱动器的列表。当单击右边的箭头时,则弹出计算机中的所有驱动器的下拉列表。默认状态下,在驱动器列表中显示的是当前驱动器,我们可以输入或从下拉列表中选择有效的驱动器标示符.
下面是它的主要属性,事件和方法.
属性Drive本属性用于返回或设置运行时选择的驱动器.默认值为当前驱动器 , 改变Drive属性会触发Change事件.
示例: Drive1.Drive = “c:/”
设置C盘为当前驱动器.
事件Change当选择一个新驱动器或通过代码改变了Drive属性时触发该事件
下面是示例代码:
2、目录列表框
目录列表框用于显示当前驱动器的目录结构,目录列表框从最高层目录开始,显示当前驱动器的目录结构,并按层次关系缩进跟目录下的所有子目录。下面是它的主要属性,方法和事件:
属性Path本属性用于返回或设置运行时选择的路径,默认路径为当前路径.改变Dri属性会触发Change事件.
示例: Dri1.Path = Drive1.Drive
设置在驱动器列表框中选中的驱动器盘符为目录列表的当前路径.
ListIndex本属性用来返回或设置控件中当前被选择的项目索引号.目录列表框中的每一个目录都可以通过ListIndex属性来标识.由Path属性所设置的当前目录的ListIndex属性值总是-1,而它上面的目录的ListIndex属性值为-2,再上面的为-3,以此类推;而它所包含的子目录恰恰相反,紧挨着的第一个子目录的ListIndex属性值为0,往下一次加一.
ListCount本属性返回当前目录下的所有子目录书.ListCount的值比最大的ListIndex的值大1.
事件Change当选择一个新目录或通过代码改变了Path属性时触发该事件
下面是示例代码:
3、文件列表框
文件列表框用来显示当前目录中的部分或者全部文件.文件列表框的大部分属性和一般的列表框相同,都具有大小,位置,字体,颜色等以及List,ListCount,ListIndex等属性.下面是主要的属性:
属性Path本属性用于返回或设置运行时选择的路径以显示其下的文件,默认路径为当前路径.改变Dri属性会触发PathChange事件.
示例: File1.Path= Dri1.Path
设置在目录列表框中选中的路径为文件列表的当前路径.
Pattern本属性用来确定程序运行时,列表框中显示那些类型的文件.除了使用”*” , ”?”等通配符外,在参数中还可以使用分号”;”来分割多种文件类型.例如:”*.ext;*.bat”
FileName本属性返回或设置所选文件的路径和文件名.可以从本属性值中返回当前列表中选择的文件名.路径可用Path属性单独检索.在功能上,本属性值与ListIndex等价.如果没有文件被选中,FileName属性将返回0长度的字符串.改变甭属性值可能会产生一个或多个如下事件:PathChange(如果改变路径),PatternChange(如果改变模式),DblClick(如果指定存在的文件)
事件Click当选择一个新的文件时触发该事件
下面是示例代码:
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
下面是主要程序代码代码:
(二)新建、修改、删除目录
以上控件除了通用对话框(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:
(2) 当然我们也可以用Drive对象.Drive对象提供了对磁盘驱动器或网络共享属性的访问方法.下面是它的主要属性及其解释:
Availablespace驱动器已用空间DriveLetter驱动器指定的字母
Freespace驱动器剩余空间DriverType驱动器类型
TotalSize驱动器全部空间FileSystem驱动器文件系统
IsReady驱动器是否已准备Path驱动器根目录
SerizlNumber驱动器序列号VolumeName驱动器卷标
ShareName驱动器共享名
主要的方法就是GetDrive,此方法用来访问一个已有的驱动器,该方法返回一个与指定路径中的驱动器相对应的Drive对象。下面的代码中,我们将说明怎样取得一个指定的驱动器的相关信息:
下面是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属性返回指定文件或文件夹的创建日期和时间,本属性为只读属性.
下面是用法:
(3)DateLastModified属性用来返回最后一次修改指定文件或文件夹的日期和时间,本属性为只读.
下面代码用一个文件举例说明了DataLastModified属性的用法:
(4)Type属性返回关于某个文件或文件夹类型的信息.例如对于以.TXT结尾的文本文件来说,本属性会返回”Text
Document”.下面的代码举例说明了返回某个文件夹类型的Type属性的用法.在这个示例中,试图将Recycle
Bin的路径或其他唯一的文件夹提供给过程.
主要方法有:
(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对象不能创建或删除驱动器。
下面的例子可以在应用程序所在目录下创建一个文件夹
2、 删除一个或多个文件夹
可以使用FileSystemObject对象的Deletfolder方法,或者folder对象的Delete方法
3、移动一个或多个文件夹
可以使用FileSystemObject对象的Movefolder方法,或者folder对象的Move方法
4、一个或多个文件夹
可以使用FileSystemObject对象的Copyfolder方法,或者folder对象的Copy方法。
二、使用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”
在此我们举一个例子看一看如何获得一个文件架下的所有子目录.下面是源代码:
三、使用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类型,包含了驱动器根目录路径的一个字串
下面是示例代码:
以上代码可以判断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结构内部完全一致。
请看下面示例:
以上代码显示了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,这个结构定义了目录的安全特性——如果操作系统支持的话
示例程序代码如下:
以上代码在c:下创建一个名为test的文件夹
5、RemoveDirectory
作用:移除一个目录
声明形式:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long
说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError.
在调用这个函数前,目录必须为空
参数说明:
参数类型及说明
lpPathName为String类型,要删除的那个目录的名字
示例代码如下:
以上代码删除c:下一个名为test的文件夹。
6、SetCurrentDirectory
作用:设置当前目录
声明形式:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError
参数说明:
参数类型及说明
LpPathNameString,新当前目录的路径
示例代码如下:
以上代码将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字串的最大长度
示例代码如下:
除了vb自带的控件外,我们还可以使用fileSystemObject文件系统对象,file对象,以及files集合。下面我们给出两个例子,更多更详细的内容请参考前面目录部分。
下面代码举例说明了如何获得一个file对象,以及如何察看它的一个属性。
对于如何获得一个files集合,以及如何用For Each……Next语句来访问这个集合中的每个file,我们可以参考下面的例子:
现成的控件一般只能显示文件,如果要进行更多的操作,请看下面的内容。
二、使用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中写入数据,下面是代码:
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,用于装载文件上一次修改的时间
示例代码如下:
以上代码显示文件的创建时间
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(非零),那么一旦目标文件已经存在,则函数调用会失败。否则目标文件被改写
示例代码如下:
以上代码将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中改换系统文件
示例代码如下:
以上代码实现了文件的移动,两次移动後,文件不变
7、DeleteFile
作用:删除指定文件
声明形式:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
说明:Long,非零表示成功,零表示失败。会设置GetLastError
与vb的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除.
参数说明:
参数类型及说明
lpFileNameString,欲删除文件的名字
示例代码如下:
以上代码删除了c:/test.txt文件