分享
 
 
 

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

王朝vb·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Visual Basic文件操作全攻略

2004-04-16■作者:潇潇■出处: yesky

谈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 commonDialog 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 / 1024, 0)

‘计算驱动器的剩余磁盘空间

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属性可以返回文件或文件夹的属性,或者设置他们的新属性.所设属性可以是以下值中任意一个或多个的逻辑组合.

常数

说明

Normal

0

为一般文件,不设置属性

ReadOnly

1

为只读文件,属性为读/写

Hidden

2

为隐藏文件,属性为读/写

System

4

为系统文件,属性为读/写

Volume

8

为磁盘驱动器卷标,属性为只读

Directory

16

为文件夹或目录,属性为只读

Archive

32

在上次备份后已经改变的文件,属性为读/写

Alias

64

为链接或快捷方式,属性为只读

Compressed

128

为压缩文件,属性为只读

(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 String) As 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

参数说明:

参数

类型及说明

lpRootPathName

String,不包括卷名的磁盘根路径名

lpFreeBytesAvailableToCaller

LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量

lpTotalNumberOfBytes

LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数

lpTotalNumberOfFreeBytes

LARGE_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

参数说明:

参数

类型及说明

lpTemplateDirectory

String,指定一个模板目录的名字,从中复制默认属性(比如目录中文件的默认压缩方式)。如设为vbNullString,则表示不使用模板

lpNewDirectory

String,新目录的名字

lpSecurityAttributes

SECURITY_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:\test", 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 String) As 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

参数说明:

参数

类型及说明

LpPathName

String,新当前目录的路径

示例代码如下:

‘函数声明

Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As 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不够大,不能容下文件名,则返回要求的缓冲区长度

参数说明:

参数

类型及说明

lpBuffer

String,用于装载系统目录路径名的一个字串缓冲区。它应事先初始化成nSize+1个字符的长度。通常至少要为这个缓冲区分配MAX_PATH个字符的长度

nSize

Long,lpBuffer字串的最大长度

示例代码如下:

‘函数声明

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As 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 SECURITY_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函数,应该是我们的首选

参数说明:

参数

类型及说明

lpFileName

String,要打开的文件的名字

dwDesiredAccess

Long,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息

dwShareMode

Long,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问

lpSecurityAttributes

SECURITY_ATTRIBUTES,指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)

dwCreationDisposition

Long,下述常数之一:

CREATE_NEW

创建文件;如文件存在则会出错

CREATE_ALWAYS

创建文件,会改写前一个文件

OPEN_EXISTING

文件必须已经存在。由设备提出要求

OPEN_ALWAYS

如文件不存在则创建它

TRUNCATE_EXISTING

讲现有文件缩短为零长度

dwFlagsAndAttributes

Long,一个或多个下述常数

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

hTemplateFile

Long,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

示例如下:

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语句作用相同

参数说明:

参数

类型及说明

lpPathName

String,欲创建的文件的名字

iAttribute

Long,下述值之一

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下提供了更多的功能

参数说明:

参数

类型及说明

lpPathName

String,欲打开文件的名字

iReadWrite

Long,访问模式和共享模式常数的一个组合,如下所示:

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格式

参数说明:

参数

类型及说明

hFile

Long,文件的句柄

lpCreationTime

FILETIME,用于装载文件的创建时间

lpLastAccessTime

FILETIME,用于装载文件上一次访问的时间(FAT文件系统不支持这一特性)

lpLastWriteTime

FILETIME,用于装载文件上一次修改的时间

示例代码如下:

‘函数声明

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 Long) As 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:\text.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

参数说明:

参数

类型及说明

lpExistingFileName

String,源文件名

lpNewFileName

String,目标文件名

bFailIfExists

Long,如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。否则目标文件被改写

示例代码如下:

‘函数声明

Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

Private Sub Form_Load()

CopyFile "c:\test1.txt", "c:\test2.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可以做到这一点.

参数说明:

参数

类型及说明

lpExistingFileName

String,欲移动的文件名

lpNewFileName

String,新文件名

dwFlags

Long,一个或多个下述常数

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:\test.txt", "d:\test1.txt" ‘移动文件

MoveFileEx "d:\test1.txt", "c:\test.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下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除.

参数说明:

参数

类型及说明

lpFileName

String,欲删除文件的名字

示例代码如下:

‘函数声明

Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

Private Sub Form_Load()

DeleteFile "c:\test.txt"

End Sub

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

写了这没多,真的很累了,所以更希望自己的辛苦没有白费,VB虽然是一个RAD类的工具,并让很多人不屑使用,但实事求是得说,VB的功能的确强大,尤其是人性化的设计,让人爱不释手,希望对喜爱VB的爱好者能够对vb能产生一个新的认识,而不仅仅停留在对其提供的现有控件的使用。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有