第11章-文件管理_第1页
第11章-文件管理_第2页
第11章-文件管理_第3页
第11章-文件管理_第4页
第11章-文件管理_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章文件管理11.1文件管理组件11.1.1TFileListBox组件11.1.2TDirectoryListBox组件11.1.3DriveCombobox组件11.1.4FilterCombobox组件11.1.5ShellTreeView组件11.1.6ShellCombobox组件11.1.7ShellListView组件11.2文件管理的相关函数和过程11.2.1RenameFile函数11.2.2DeleteFile函数11.2.3FileExists函数目录11.2.4FileGetAttr函数11.2.5FileSetAttr函数11.2.6DirectoryExists函数

11.2.7CreateDir函数11.2.8RemoveDir函数11.3文件管理操作

11.3.1文件类型11.3.2适合于各种文件的操作11.3.3文本文件的操作11.3.4有类型文件的操作11.4小结11.5习题目录 文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是本章我们主要讨论的对象。

Delphi继承了ObjectPascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准组件,同时也提供了更多的文件管理函数。本章首先介绍Delphi提供的文件组件的使用方法,然后是Delphi文件管理的标准过程/函数,最后介绍文件访问具体操作。11.1文件管理组件Delphi提供了丰富的文件管理组件,主要有两种风格。一种为位于Delphi组件面板ToolPalette的Win3.1选项卡上的TFileListBox、TDirectoryListBox、TDriveCombobox、TFilterCombobox四个组件,为传统的Windows3.x风格;另一种为位于Sample选项卡上的TShellListView、TShellCombobox、TShellTreeView三个组件,为Windows9X风格。使用它们可以很方便的编写类似Windows资源管理器程序。11.1.1FileListBox组件 该组件的功能是在应用程序窗体上提供一个文件列表框,显示指定目录下的文件列表。它和其他它三个组件联合使用,可以为用户提供磁盘上所有文件查看和选择功能。FileListBox类和ListBox类都是由CustomListBox类派生而来,因此它们用法有很多相同之处,这里只介绍它独有的属性。

1.Directory属性:该属性用来指定包含TFileListBox组件内所显示文件的文件夹名。改变该属性的文件夹名,则文件列表框中将显示此文件夹所包含的文件。

2.Drive属性: 该属性用来指定包含TFileListBox组件内所显示文件的驱动器名。改变该属性的驱动器名,TFileListBox组件的Directory属性自动改为此驱动器下的当前目录。

3.FileEdit属性: 该属性指定一个与文件列表框组件关联的Edit组件。当用户在文件列表框组件中选择文件时,被选择文件的文件名(FileName属性值)将显示在Edit组件中;如果当前没有文件被选取,则该Edit组件中将显示当前的Mask属性值(Mask属性的作用后面将有详细介绍),就像标准的Windows中的打开和保存对话框中的功能。 用户对Edit组件的Text属性所做的直接修改不会影响到文件列表框组件,但可以通过调用ApplyFilePath方法用修改后的Text属性值更新文件列表框组件的当前设置。

4.FileName属性: 该属性返回文件列表框中用户选择的文件名,包含路径信息。 可以通过设置该属性把文件列表框初始化为选中某个特定文件;读取该属性则可以获取用户选择的文件名。如果文件列表框关联了Edit(即设置了FileEdit属性),FileName属性值将显示在该组件中。

5.FileType属性: 该属性指定将在文件列表框中显示名称的文件的属性。该属性定义如下:

propertyFileType:TFileType;且有如下类型定义:

type TFileAttr=(ftReadOnly,ftHidden,ftSystem,ftVolumeID,ftDirectory,ftArchive,ftNormal); TFileType=setofTFileAttr;

其中文件类型的可选值及其意义如表11-1:表11-1文件类型可选值及意义值意义ftReadOnly文件列表框中显示只读类型的文件ftHidden文件列表框中显示隐藏类型的文件ftSystem文件列表框中显示系统类型的文件ftVolumeID未用ftDirectory文件列表框中显示目录ftArchive文件列表框中显示存档类型的文件ftNormal文件列表框中显示普通的文件

6.Mask属性: 该属性用来设置文件列表框中将显示文件的过滤条件。如果设置该属性,则指定文件夹下只有满足该过滤条件的文件名才会在文件列表框中显示。其值是含有文件通配符的文件名。其中“*”表示任意字符串,而“?”表示任意一个字符。例如“*.*”表示所有文件,也是该属性的默认值。

7.ShowGlyphs属性:该属性为Boolean类型,当值为True时,表示在文件列表框显示的文件名旁同时显示表示其类型的文件图标;当值为False时,则只显示文件名而不显示该图标。11.1.2DirectoryListBox组件 该组件的功能是在应用程序窗体上提供一个目录列表框,显示指定驱动器下的目录树结构。该类同样由TCustomListBox类派生而来,这里只介绍其独有属性。

1.CaseSensitive属性: 该属性为Boolean类型,用来指定文件系统对于文件名的大小写是否敏感。取值True是为大小写敏感,False则不区分大小写。

2.Directory属性:该属性用来返回目录列表框中打开的当前目录名。

3.DirLabel属性: 该属性指定一个与目录列表框组件关联的Label组件。当用户在目录列表框组件中选择目录,被选择目录的目录名(Dierctory属性值)将作为该Label组件的标题显示。

4.Drive属性: 该属性指定目录列表框所显示的目录树结构属于哪一个驱动器。如果该值发生改变,则目录列表框将显示指定驱动器的目录树,且自动打开指定驱动器下的当前目录。 5.FileList属性: 该属性用来指定一个与目录列表框相关联的文件列表框组件,以显示目录列表框中所选当前目录下的文件。一旦文件列表框与目录列表框建立起关联,则文件列表框的Directory属性值、Dirve属性值将会随着目录列表框的相关属性值的改变而自动改变。即,当目录列表框中的当前目录发生改变时,文件列表框会自动显示修改后的当前目录下的文件。11.1.3DriveCombobox组件 该组件功能是在应用程序窗体上提供一个驱动器组合列表框,供用户选择驱动器。 因TDriveCombobox类和TCombobox类都是由TCustomCombobox类派生而来,所以它们用法有很多相同之处,这里只介绍TDriveCombobox独有的几个属性。

1.DirList属性:该属性用来指定一个与驱动器组合列表框相关联的目录列表框,以显示指定驱动器下的目录树结构。关联建立后,当驱动器组合列表框中所选驱动器发生改变,则关联的目录列表框的Drive属性、Directory会自动改变,即自动显示所选驱动器下的目录树结构,自动打开指定驱动器下的当前目录。

2.Drive属性:返回用户选择的驱动器名。在设计期指定该值可以将TDriveCombobox初始化为指向某个特定的驱动器。

3.TextCase属性:该属性指定列表框中显示驱动器名的字母是大写还是小写。11.1.4FilterCombobox组件该组件的功能是提供给用户一个选择文件过滤属性的选择框。主要属性如下:

1.FileList属性:该属性用来指定一个与过滤属性选择框关联的文件列表框组件,以限制该文件列表框显示文件的类型。一旦建立关联,文件列表框中所显示文件将随过滤属性的改变而自动变化。

2.Filter属性:该属性用于设置和保存用户设置的文件过滤条件列表。该列表可以在设计期用FilterEditer编辑,也可以在运行时通过代码来设置。其格式如下例:

FilterComboBox1.Filter:='Textfiles|*.TXT';

FilterComboBox1.Filter:='Textfiles(*.TXT)|*.TXT|Pascalfiles(*.PAS)|*.PAS';

FilterComboBox1.Filter:='Allfiles|*.TXT;*.PAS;*.WB1';

3.Mask属性: 该属性返回用户当前所选择的过滤条件。如果关联了文件列表框组件,则文件列表框的Mask属性值会随该属性值的变化自动变化。

例11-1磁盘文件浏览器 利用上述几个组件,可以很方便的制作一个Win3.1风格的磁盘文件浏览器。步骤如下:

1.新建一个VCLFormsApplication-DelphiforWin32工程,在ToolPalette的win3.1页上找到以上几个组件添加到窗体上,就用默认名字。

2.修改DriveCombobox1的DirList属性为DirectoryListBox1。

3.修改DirectoryListBox1的FileList属性为FileListBox1。

4.修改FilterCombobox1的FileList属性为FileListBox1,并修改其Filter属性,指定文件过滤条件。

5.运行 程序运行界面如图11-1:图11-1磁盘文件浏览器界面11.1.5ShellTreeView组件

ShellTreeView组件显示一个Windows资源管理器样式的文件夹树状列表,使用它可以很方便的制作和Windows资源管理器一模一样的文件夹树状浏览程序。因该组件由CustomTreeView派生而来,这里只介绍其主要属性。

1.AutoContextMenus属性: 该属性是Boolean类型,用来指定TShellTreeView组件是否根据右键单击的对象自动显示系统菜单。默认值为True,表示当右键单击组件内显示的某个对象时,组件会根据该象的类型显示相应的系统菜单。

2.AutoRefresh属性: 该属性是Boolean类型,用来指定ShellTreeView组件是否根据系统资源改动情况自动更新显示。默认值是False。

3.ObjectTypes属性: 该属性是一个集合属性,用来指定ShellTreeView组件中显示的系统资源类型。类型定义如下:

FObjectTypes:TShellObjectTypes; TShellObjectTypes=setofTShellObjectType;TShellObjectType=(otFolders,otNonFolders,otHidden); 其中otFolders表示文件夹对象,otNonFolders表示非文件对象,otHidden表示具有隐藏属性的对象。下面图11-2和图11-3就是该属性值别取[otFolders]和[otFolders,otNonFolders]时的情况:

图11-2图11-3

4.Root属性: 该属性指定一个文件夹作为TShellTreeView组件的根结点,该文件夹可以是一个系统文件夹,也可是用户指定任一磁盘路径。默认值为rfDesktop,即将“桌面”作为根结点,如上图所示。

5.ShowButtons、ShowShellImages、ShowLines属性:这三个属性都是Boolean类型,分别用来指定TShellTreeView组件是否显示对象树中的展开或收缩按钮、系统图标、连接虚线。默认值都为True,表示显示这些元素,如上图。

6.ShellCombobox、ShellListView属性:

这两个属性分别用来指定和TShellTreeView组件相关联的TShellCombobox组件和TShellListView组件。设置过该属性后,当TShellTreeView组件中选中的对象发生变化时,与之关联的TShellCombobox组件和TShellListView组件中的显示内容会自动更新。11.1.6ShellCombobox组件

TShellCombobox组件用来显示一个Windows资源管理器样式的对象下拉列表框,如下图11-4:图11-4ShellCombobox组件 该组件的重要属性主要有三个,Root、ShellListView、ShellTreeView,用法与TShellTreeView类似,这里不再重复。

11.1.7ShellListView组件

TShellListView组件用来显示一个Windows资源管理器样式的对象列表框,如图11-5。下面介绍它的重要属性。图11-5ShellListView组件

1.AutoContextMenus、AutoRefresh、Root、ObjectTypes、ShellCombobox、ShellTreeView: 这些属性的功能与用法类似TShellTreeView、TShellCombobox组件,这里不再重复。

2.ViewStyle:

该属性是枚举类型,用来指定TShellListView组件显示对象信息的方式。相关定义如下:

FViewStyle:TViewStyle; TViewStyle=(vsIcon,vsSmallIcon,vsList,vsReport);

四个取值分别表示以大图标、小图标、列表、详细信息方式显示对象信息,类似Windows资源管理器中的“查看”选项。

3.ShowColumnHeaders:该属性为Boolean类型,只有在ViewStyle属性值为vsReport时才有效,用来指定是否显示详细信息的列标题。默认值为True,表示显示详细信息的列标题。 4.ColumnClick: 该属性为Boolean类型,只有在ViewStyle属性值为vsReport且ShowColumn属性为True时才有效,用来指定是否充许单击详细信息的列标题。默认值为True,表示可以单击详细信息的列标题。

5.GridLines:该属性为Boolean类型,只有在ViewStyle属性值为vsReport时才有效,用来指定是否显示详细信息列表的网格线。默认值为False,表示不显示详细信息列表的网络线。

6.RowSelect:

该属性为Boolean类型,只有在ViewStyle属性值为vsReport时才有效,用来指定当鼠标单击列表中某个对象时,是否整行选中该对象的详细信息(高亮显示)。默认值为False,表示当鼠标单击列表中某个对象时,只选中该对象本身。

7.HotTrack:

该属性为Boolean类型,用来指定是否自动选中(高亮显示,此时可敲击回车键打开该对象)组件中当前鼠标位置处的对象。默认值为False,表示不自动选中当前鼠标位置处的对象。

8.MultiSelect:

该属性为Boolean类型,用来指定是否充许同时选中对象列表中的多个对象。默认值为False,表示不自动选中当前鼠标位置处的对象。如果为True,则可以支持扩展选择功能实现对象多选。

9.Sorted:

该属性为Boolean类型,用来指定是否对列表中的对象按名称排序。默认值为True。 例11-2“我的资源管理器”示例程序 利用上述几个组件,可以很方便的制作一个Win9X风格的磁盘文件浏览器。步骤如下: 1.新建一个VCLFormsApplication-DelphiforWin32工程,在ToolPalette的Sample页上找到以上几个组件添加到窗体上,就用默认名字。 2.修改ShellTreeView组件的ShellCombobox属性指向添加的TShellCombobox组件,TShellListView属性指向添加的TShellListView组件;修改TShellCombobox组件的ShellListView属性指向添加的TShellListView组件。 3.其它属性根据需要设置。4.添加五个按钮,分别修改其标Caption属性为“向上”、“新建”、“删除”、“转到”、“改名”,如下图程序界面。

5.为TShellListView组件添加右键弹出菜单,菜单项如下图所示。

6.编写相应的码,调试运行。 程序运行界面如图11-6:图11-6自制资源管理程序界面 源代码:

var i:integer=1;//自定义全局变量

//自定义删除文件夹的函数

functionTForm1.Deltree(path:string):Boolean; varSearchRec:TSearchRec; olddir:string; begin ifDirectoryExists(path)then begin oldDir:=GetCurrentDir; ChDir(path); FindFirst('.',faAnyFile,SearchRec);

repeat FileSetAttr(SearchRec.Name,0); if(SearchRec.AttrandfaDirectory>0)then begin if(SearchRec.Name[1]<>'.')then if(notDeltree(SearchRec.Name))thenbreak; end else if(notDeleteFile(SearchRec.Name))then break; until(FindNext(SearchRec)<>0); ChDir('..'); Result:=ReMoveDir(path); SetCurrentDir(oldDir);

end else Result:=False; end;

//“向上”功能实现

procedureTForm1.SpeedButton1Click(Sender:TObject); begin shelllistview1.Back; end;

//“新建”文件夹功能

procedureTForm1.SpeedButton2Click(Sender:TObject); vars:string; begin

s:=shellcombobox1.Path+'\'+'新建文件夹'+inttostr(i); ifdirectoryexists(s)then begin i:=i+1; s:=shellcombobox1.Path+'\'+'新建文件夹'+inttostr(i); end; mkdir(s); i:=i+1; end; //“删除”功能实现

procedureTForm1.SpeedButton3Click(Sender:TObject); vars:string; begins:=shelllistview1.Folders[shelllistview1.Selected.index].PathName;if(filegetattr(s)andfadirectory)=fadirectorythentryrmdir(shelllistview1.Folders[shelllistview1.Selected.index].PathName);exceptshowmessage('删除目录失败!请确认目录是否非空!');exit;endelsetrydeletefile(s);except

showmessage('删除文件失败!访问被拒绝!'); exit; end; shelllistview1.Update; end;//“转到”功能实现

procedureTForm1.SpeedButton4Click(Sender:TObject); vars:string; begin ifselectdirectory('请选择要转到的文件夹','rfdesktop',s)then ifdirectoryexists(s)thenshelltreeview1.Path:=s; end;

//“重命名”功能实现

procedureTForm1.SpeedButton5Click(Sender:TObject); begin ifshelllistview1.SelCount=1then shelllistview1.SelectedFolder.Rename(inputbox('重命名','请输入新文件名:',shelllistview1.Folders[shelllistview1.Selected.index].DisplayName)); end;

//“图标”查看方式

procedureTForm1.N2Click(Sender:TObject); begin shelllistview1.ViewStyle:=vsicon; end;

//“小图标”查看方式

procedureTForm1.N3Click(Sender:TObject); begin shelllistview1.ViewStyle:=vssmallicon; end; //“列表”查看方式

procedureTForm1.N4Click(Sender:TObject); begin shelllistview1.ViewStyle:=vslist; end;

//“详细信息”查看方式

procedureTForm1.N5Click(Sender:TObject); begin shelllistview1.ViewStyle:=vsreport; end;11.2文件管理的相关函数和过程Delphi中除了每上节中介绍的那些用于文件和目录管理的组件外,还提供了很多用于文件和目录操作的标准函数或过程。熟练掌握并灵活使用这些标准过程,可以很方便的编写磁盘文件管理类的应用。本节介绍几个封装在SysUtils单元中的常用标准过程,有了这些作为基础,更多的标准过程的用法请读者根据其名称及参数自己尝试。11.2.1RenameFile函数 函数定义:functionRenameFile(constOldName,NewName:string):Boolean;

函数的功能是将文件改名。要改名文件的文件名由字符串常量参数OldName给出,而更改后的新文件名由字符串常量参数NewName指出。返回值为Boolean类型,表示改名操作是否完成。当改名操作成功时,返回值为False;如果操作失败(如程序没有修改文件的权限),则返回值为False。 需要注意的是,如果NewName参数指定的新文件名与已经存在的文件名冲突,则该函数在Windows系统和Linux系统下执行的操作不同:在Windows系统下,改名操作失败;在Linux系统下,该函数会覆盖已存在的文件。11.2.2DeleteFile函数 函数定义:functionDeleteFile(constFileName:string):Boolean;

函数功能是从磁盘上删除由字符串常量参数FileName指定文件名的文件。返回值为Boolean类型,表示删除操作是否完成。如果删除成功,则返回True;如果文件不能删除或指定的文件不存在,则返回False。11.2.3FileExists函数 函数定义:functionFileExists(constFileName:string):Boolean; 该函数功能是判断由字符串常量参数FileName指定文件名的文件是否存在,返回值是Boolean类型。如果指定文件存在,则返回True,否则返回False。11.2.4FileGetAttr函数 函数定义:functionFileGetAttr(constFileName:string):Integer;

该函数功能是获取由字符串常量参数FileName指定名称的文件的文件属性,返回值是整型。该函数只能使用在Windows平台。关于文件属性的描述,Delphi用一个32位二进制数最低8位的取值来表示。每一位表示一种属性,如果该位 值为1,则表示具有该属性,为0则表示不具有该属性。高24位全部为0。为了使用方便,Delphi在SysUtils单元还定义了几个相应的常量值,如下:

{Fileattributeconstants} //此部分代码摘自Delphi源码SysUtils单元的定义

faReadOnly=$00000001platform; faHidden=$00000002platform; faSysFile=$00000004platform; faVolumeID=$00000008platform; faDirectory=$00000010; faArchive=$00000020platform; faSymLink=$00000040platform; faAnyFile=$0000003F; 因此,函数FileGetAttr的返回值为Integer类型。通过该返回值,对照上述定义,就可以很方便的得到文件具有的属性。例如返回值为3,则文件具有只读和隐藏属性,如果返回值为6,则具有隐藏和系统属性。示例见例11-3

11.2.5FileSetAttr函数 函数定义:functionFileSetAttr(constFileName:string;Attr:Integer):Integer;

该函数功能是设置由字符串常量参数FileName指定名称的文件的文件属性,新的文件属性由参数Attr给出。返回值是整型。该函数只能使用在Windows平台。 例11-3查看文件属性的程序 程序功能类似于Windows资源管理器中文件对象的右键菜单中的“属性”菜单项,在文件列表框中单击选中某个文件,下面的文件属性组合框中,该文件所具有的属性相对应的复选框即处于选中状态。如果想修改文件属性,只需要修改相应的复选框的选中状态既可。程序运行界面如图11-7:图11-7文件属性查看程序运行效果图

源代码如下:

var fileatt,newatt:word; //全局变量,分别用来保存原来的文件属性,和要修改的文件属性

//在文件列表框中,单击选中某个文件后,获取并显示该文件属性:

procedureTForm1.FileListClick(Sender:TObject); begin readonlybox.Enabled:=true; systembox.Enabled:=true; hiddenbox.Enabled:=true; arrchbox.Enabled:=true; fileatt:=filegetattr(filelist.FileName);

readonlybox.Checked:=(fileattandfareadonly)=fareadonly; systembox.Checked:=(fileattandfasysfile)=fasysfile; hiddenbox.Checked:=(fileattandfahidden)=fahidden; arrchbox.Checked:=(fileattandfaarchive)=faarchive; end; //加上或去掉只读属性

procedureTForm1.readonlyboxClick(Sender:TObject); begin newatt:=filegetattr(filelist.FileName);ifreadonlybox.Checkedthennewatt:=newattorfareadonly

elsenewatt:=newattandnotfareadonly; filesetattr(filelist.FileName,newatt); end; //加上或去掉隐藏属性

procedureTForm1.hiddenboxClick(Sender:TObject); begin newatt:=filegetattr(filelist.FileName); ifhiddenbox.Checkedthennewatt:=newattorfahidden elsenewatt:=newattandnotfahidden; filesetattr(filelist.FileName,newatt); end; //加上或去掉系统属性

procedureTForm1.systemboxClick(Sender:TObject);

begin newatt:=filegetattr(filelist.FileName); ifsystembox.Checkedthennewatt:=newattorfasysfile

elsenewatt:=newattandnotfasysfile; filesetattr(filelist.FileName,newatt); end;

//加上或去掉存档属性

procedureTForm1.arrchboxClick(Sender:TObject); begin newatt:=filegetattr(filelist.FileName); ifarrchbox.Checkedthennewatt:=newattorfaarchive elsenewatt:=newattandnotfaarchive; filesetattr(filelist.FileName,newatt); end;11.2.6DirectoryExists函数函数定义:functionDirectoryExists(constDirectory:string):Boolean;

该函数的功能是判断由字符串常量参数Directory指定名称的文件夹是否存在,返回值是Boolean类型。如果指定文件夹存在,则返回True,否则返回False。 如果指定的目录名是绝对路径,则该函数沿着参数指定的路径搜索指定的文件夹,否则该函数只在当前目录下搜索指定文件夹。 注意:在仅限Windows系统下使用的FileCtrl单元中也包含有一个DirectoryExists函数,但是即使代码不需要跨平台使用,也不提倡使用该函数。11.2.7CreateDir函数 函数定义:functionCreateDir(constDir:string):Boolean;

该函数用来创建一个由字符串常量参数Dir指定名称的目录,返回值为Boolean类型。如果创建成功则返回True,否则返回Fales。

11.2.8RemoveDir函数 函数定义:functionRemoveDir(constDir:string):Boolean;

该函数用来删除一个由字符串常量参数Dir指定名称的空目录,返回值为Boolean类型。如果成功删除则返回True,否则返回Fales。 注意:只有目录存在且是空目录才能用该方法删除。11.3文件管理操作11.3.1文件类型

Delphi根据文件内数据元素的不同,将文件分为三种类型,即文本文件、类型文件和无类型文件。

1.文本文件

Delphi中的文本文件是指由ASCII字符组成,按行存储的文件,以回车符(通常还会有一个换行符)作为一行结束的标志。该类型文件变量声明方式如下:var TextFileVar:TextFile;

文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。而且文本文件只能单独以读或写的方式打开,在一个打开的文本文件上同时进行读、写操作是不允许的。

2.类型文件 类型文件是指文件中的数据无素属于固定长度的数据类型,该数据类型即文件的类型。因此,文件类型不能是动态数据类型,比如长字符串、类、对象、指针、变量、其他文件以及包含有这些类型的构造类型。例如:

type PhoneEntry=record FirstName,LastName:string[20]; PhoneNumber:string[15]; Listed:Boolean; end; PhoneList=fileofPhoneEntry; 上面代码中先定义一个名为PhoneEntry的记录类型,然后定义一个基于这种记录类型的文件类型PhoneList,用于定义存储多条电话记录的文件。也可以直接用fileof结构进行变量定义,如:

varList1:fileofPhoneEntry;

3.无类型文件 无类型文件提供一个底层的I/O通道,主要用于对磁盘文件的直接访问,不需要理会文件的类型和结构。无类型文件只接用file关键词来声明即可,例如:

varDataFile:file; 对于无类型文件来说,Reset和Write过程可以用一个额外的参数在数据传送时数据块的大小。基于历史的原因,块的大小默认为128字节。当该值为1时,才能准确的反映文件夹的大小,因为毕竟不是所有的文件长度都是128字节的整数倍。除了Reset和Write过程外,所有适合类型文件操作的标淮过程同样适用于无类型文件的操作。但是在高速数据传输时,可以用BlockRead和BlockWrite过程来替代Read和Write过程。关于这个两个过程的用法,请参阅联机帮助。11.3.2适合于各种文件的操作

1.文件的打开与关闭

AssignFile:将一个外部文件名和一个文件变量建立关联 过程声明:procedureAssignFile(varF;FileName:string);

其中,变量参数F为一任意类型的文件变量名,而常量字符串参数FileName则指定一个将要于文件变量F建立关联的外部文件名。该过程调用成功后,直至关闭,对于文件变量F的所有操作都将应用于FileName所指定的文件。如果FileName参数为空,则文件变量F将和标准的输入或输出文件建立关联,具体要看调用该过程之后调用的是Reset过程还是ReWrite过程。 注意,不要对已经打开了的文件变量使用该操作。

Reset:打开一个存在的文件 过程声明:procedureReset(varF[:File;RecSize:Word]);

其中,F是一个已经用AssignFile过程与某个外部文件相关联的文件变量,RecSize参数只有在F是无类型文件时,用来指定数据传送过程中一次处理的数据块的大小,默认值是128字节。该过程用当前的文件访问模式(针对类型或无类型文件),打开一个文件名已和文件变量F相关联的已存在的外部文件。如果指定名称的文件不存在,或者不能用当前的访问模式访问,都将会返回一个错误结果。如果文件变量已经被打开,则会先关闭文件,然后再重新打开,将文件位置指针向文件的开始。 注意:默认的文件访问模式是2(可读写)。如果没有把该模式设置为只读模式,则在试图打开只读属性的文件时会出错。如果文件变量F之前关联的是一个空文件名,则调用Reset后,则F指向标准的输 入文件如果文件变量F之前关联的是一个文本文件,则调用Reset后,该文本文件以只读模式打开调用Reset过程后,函数Eof(F)的值应该为False,除非F关联的文件是空文件。 文件打开过程应用举例一

var F:TextFile; S:string; begin ifOpenDialog1.Executethen begin AssignFile(F,OpenDialog1.FileName); Reset(F); end; end;

Rewrite:创建并打开一个新文件 过程声明:procedureRewrite(varF:File[;Recsize:Word]);

该过程参数的意义与用法与Reset相同,功能是创建一个新的文件并打开。如果指定名称的文件已经存在,则该过程先将其删除,再建立同名的空文件。 注意:如果文件已经被打开,则该过程先关闭它,然后再重新创建该文件,并把文件位置指针指向空文件的开始处。如果文件变量F之前关联的是一个空文件名,则调用Rewrite后,则F指向标准的输出文件如果文件变量F之前关联的是一个文本文件,则调用Rewrite后,该文本文件以只写模式打开调用Rewrite过程后,函数Eof(F)的值总是True。

CloseFile:关闭一个打开的文件 过程声明:procedureCloseFile(varF); 该过程结束文件变量F与外部磁盘文件的关联,完成文件的更新,并关闭文件,释放文件句柄。 另外,关于文件打开与关闭的例程还有FileOpen(打开一个指定的文件并返回文件句柄),FileCreate(创建一个给定文件名的文件并返回文件句柄)、FileClose(关闭一个指定句柄的文件)。明显地,这三个例程操作的对象不是Delphi的文件变量,而是操作系统的文件句柄,是较低级别的文件访问例程,Delphi并不鼓励使用它们。

2.文件定位

Seek:把文件当前位置移到指定部分 过程声明:procedureSeek(varF;N:Longint); 其中参数F为已打开某个磁盘文件的文件变量,可以是类型文件或无类型文件;N是一个Longint类型的表达式,指定要将文件指针移动到文件中的位置。文件第一部分的位置值为0。 显然,代码seek(f,filesize(f))的功能是将文件指针移至文件未尾。

FilePos:返回文件的当前位置 函数声时:functionFilePos(varF):Longint;其中F为已打开某磁盘文件的文件变量。函数返回值为文件当前位置相对于文件开始处的字节偏移量。如果文件指针正好在文件开始处则返回值为0。

EOF:返回文件结束标志 函数声明: 对于类型或无类型文件:functionEof(varF):Boolean;

对于文本文件:functionEof[(varF:Text)]:Boolean;函数的功能是测试文件指针是否已处于文件结尾处。其中参数F是一个已经以只读模式打开的文件变量,如果参数F省略,则假定使用标准输入文件。如F是一个空文件或者文件指针已经处于文件的最后一个字符之后,则函数返回值为True,否则返回值为False。如果文件是以写的模式打开,则Eof函数无效。

3.文件删除与截断

Erase:删除一个存在的文件 过程声明:procedureErase(varF);

其中参数F是一个任意类型的文件变量。该过程用于删除文件变量F相关联的外部文件。注意,在删除之前,一定要先关闭文件。 该过程与DeleteFile函数的区别是,前者操作的是文件变量,而后者是用文件名来指定要删除的文件。当文件不能删除时,前者会产生一个异常,而后者只返回False,并不引发异常。

Truncate:从文件当前位置将文件截断 过程声明:procedureTruncate(varF);

该过程将文件变量F打开的文件由文件指针所在的当前位置处截断,即把当前位置设为文件结束点。需要注意的是,该过程对文本文件没有作用。

4文件读写

Read:从文本或记录文件中读取变量 过程定义: procedureRead(F,V1[,V2,...,Vn]);//适用于类型文件; procedureRead([varF:Text;]V1[,V2,...,Vn]);//适用于文本文件 该过程从文件变量F打开的文件中读取内容存入变量V1,V2,…,Vn中。

Write:将指定变量写入文本或记录文件 过程定义:

procedureWrite(F,V1,...,Vn);//适用于类型文件;

Write([varF:Text;]P1[,P2,...,Pn]);//适用于文本文件;该过程向文件变量F打开的文件中写入与文件同类型变中的内容。文件必须已经打开,如果是文本文件,则文件变量是可选项,如果不指定,则使用标准输出文件。11.3.3文本文件的操作

1.文本文件的打开和关闭

文本文件的打开需要两个步骤:

(1).调用AssignFile标准过程将文件变量与文件名关联;

(2).初始化读写。 初始化读写有三种方式:

1.Reset:以只读方式打开文件并把文件指针移动到文件开始处;

2.Rewrite:以写方式创建并打开一个新文件;

3.Append:以写方式打开已存在的文件并把文件指针定位在文件结束处;

Append过程仅用于对文本文件的追加内容的操作,其过程定义如下: procedureAppend(varF:Text);

如果调用Reset或Append过程打开文件而文件不存在时将会引发一个I/O异常。

文件的关闭很简单,只须调用CloseFile过程即可。

Delphi应用程序在退出时会自动关闭所有打开的文件,但编写代码关闭文件可以确保释放文件句柄,同进也能增强程序的可移植性。 为保持兼容,用户也可以用Assign建立文件关联,用Close关闭文件。

2.文本文件的读写 从文本文件中读取信息有Read、Readln两个标准过程可用。 当读入数值时,Read、Readln假定数值是用一个或多个空格分开的,而不是逗号、分号或其它字符。对如下一条语句: Read(TextFileVar,Num1,Num2,Num3);

如果文件中的数值是:

100200300

则能够成功读入,而若文件中的数值是

100200,300

则Read读入“200,”并试图把它转化成一个数值时会引发一个异常。 当读入字符是字符串时,Read、Readln过程总是读取尽可能多的字符填充到字符串变量中或一直读到行结束符为止。因此从文本文件中读取格式化的字符串数据,必须声明与其长度相匹配的字符串变量。如果要从文件中读取单词,必须先把文件中的每一行读入字符串,然后再从字符串中逐个分析出单词。或者一次只从文本文件中读入一个字符并测试每个字符后是否是单词断开处。 同样,也可以用Write、Writeln两个标准过程往文件中写入数据。

3.文本文件的编辑 想要对一个文本文件进行编辑,可以用TMemo或TRichEdit组件的Lines属性的LoadFromFile方法装入文件,编辑后再调用SaveToFile方法装所做修改保存到文件中去即可。

例11-4.文本文件应用举例——自制记事本程序 本程序仿照Windows自带的记事本程序功能用TRichEdit组件制作,运行界面如图11-8:

图11-8自制记事本程序界面 全局变量定义:

openfile:textfile;//定义文本类型文件变量名

filename:string;//记录要操作的磁盘文件的文件名

fileopen:boolean=false;//标记是否有文件被打开的合局布尔变量

textchange:boolean=false;//标记文本是否被修改的布尔变量

saved:boolean=false;//标记文本是否被存储过

其中与文本文件操作相关的菜单命令代码如下:

“打开”菜单项的处理过程:

procedureTForm1.N2Click(Sender:TObject); varbuff:string; begin

ifopendialog1.Executethen try filename:=opendialog1.FileName; assignfile(openfile,filename); reset(openfile); whilenoteof(openfile)do begin readln(openfile,buff); richedit1.Lines.Add(buff); end; fileopen:=true; except showmessage('文件打开错误!指定的文件不存在或路径错误!'); end;

end;

“保存”菜单项处理过程

procedureTForm1.N4Click(Sender:TObject); vari:integer; begin ifnotfileopenthen ifsavedialog1.Executethenfilename:=savedialog1.FileName; try assignfile(openfile,filename); rewrite(openfile); fori:=0torich

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论