Delphi文件管理.docx
- 文档编号:6651074
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:53
- 大小:43.94KB
Delphi文件管理.docx
《Delphi文件管理.docx》由会员分享,可在线阅读,更多相关《Delphi文件管理.docx(53页珍藏版)》请在冰点文库上搜索。
Delphi文件管理
文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。
一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是本章我们主要讨论的对象。
Delphi继承了ObjectPascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更多的文件管理函数。
利用Delphi的强大功能,开发一个自己的文件管理系统就成为很容易的事。
本章首先介绍Delphi文件管理的基本概念和标准过程/函数,并提供了一个记录文件的应用实例,这是从我们实际课题开发中提取出来的。
而后介绍Delphi提供的文件控件的使用方法。
最后提供的一个综合例程MDI文件管理器则是对Delphi文件管理功能的综合应用。
6.1文件类型和标准过程
Delphi同ObjectPascal一样支持三种文件类型,即:
文本文件、记录文件、无类型文件。
6.1.1文本文件
文本文件类型的变量用如下方法声明:
var
TextFileVar:
Text;
文本文件是以行为单位进行读、写操作的。
由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。
而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。
6.1.1.1文本文件的打开、关闭
文本文件的打开需要两个步骤:
(1).文件变量与文件名关联;
(2).初始化读写。
联文件变量与文件名调用AssignFile标准过程:
AssignFile(TextFileVar,FileName);
FileName既可以是全路径名,也可以仅是文件名。
对于后者系统将在当前目录下查找。
AssignFile是Delphi新提供的一个函数,其功能等价于ObjectPascal中的Assign。
而Assign在Delphi中更多地被用作一个方法名。
初始化读写有三种方式:
1.Reset:
为读打开文件并把文件指针移动到文件首;
2.Rewrite:
为写创建一个新文件;
3.Append:
为写打开存在的文件并把文件指针定位在文件尾。
当使用Reset或Append过程而文件不存在时将会引发一个I/O异常。
有关I/O异常的处理请参看本章例程和第十二章中的介绍。
文件的关闭很简单,只须调用CloseFile过程即可。
虽然Delphi应用程序在退出时会自动关闭所有打开的文件,但自己动手关闭文件可以确保释放文件句柄,并使程序的可移植性增强。
为保持兼容,Delphi也允许用户用Assign建立关联,Close关闭文件。
6.1.1.2文本文件的读写
从文本文件中读取信息用Read、Readln两个标准过程。
当读入数值时,Read、Readln假定数值是用一个或多个空格分开的,而不是逗号、分号或其它字符。
对如下一条语句:
Read(TextFileVar,Num1,Num2,Num3);
如果文件中的数值是:
100200300
则能够成功读入,而若文件中的数值是
100200,300
则Read读入“200,”并试图把它转化成一个数值时会引发一个异常。
当读入字符是字符串时,Read、Readln过程总是读取尽可能多的字符填充到字符串变量中或一直读到行结束符为止。
因此从文本文件中读取格式化的字符串数据,必须声明与其长度相匹配的字符串变量。
如果要从文件中读取单词,必须先把文件中的每一行读入字符串,然后再从字符串中逐个分析出单词。
或者一次只从文本文件中读入一个字符并测试每个字符后是否是单词断开处。
格式化字符串之间的分隔符应读入到一个临时变量中,而字符串与数值、数值与数值间的分隔符读入时会自动识别剔除。
对如下一行数据:
Mon12:
104050
定义
var
Day:
string[3];
Time:
string[5];
Num1,Num2:
Integer;
则须用如下的read语句读入:
read(TextFileVar,Day,c,Time,Num1,Num2);
C为一个临时字符变量。
6.1.1.3文本文件的编辑
在Delphi中实现对一个文本文件的编辑,只须让其与一个Tmemo控件建立关联即可:
Memo1.Lines.LoadFromFile(TextFileName);
这样在TMemo上所做的一切修改当调用Memo部件的SaveToFile方法后都会反映到文件中去。
6.1.2记录文件
记录文件是一种操作更为灵活的文件类型。
它允许同时为读和写打开,而且由于记录文件中每条记录的长度固定,所以可随机存取。
记录文件的类型变量可如下声明:
var
RecordFileVar:
fileofRecordType;
RecordType是一个自定义的记录类型。
有关记录文件的操作我们将在下一节中结合例程进行讨论。
6.1.3无类型文件
无类型文件提供了底层的I/O通道,可用于存取可变长度记录的文件。
经常用于文件的复制操作中。
由于Delphi提供了更好的方法(见第四节),所以无类型文件很少使用。
有兴趣的读者可参看BlockRead、BlockWrite两个联机帮助主题。
6.1.4Delphi的文件管理标准过程
根据功能我们把标准过程划分为十一类进行介绍。
6.1.4.1文件的打开与关闭
AssignFile:
把一个外部文件名和一个文件变量相关联
Reset:
打开一个存在的文件
Rewrite:
创建并打开一个新文件(或覆盖原有文件)
Append:
以添加方式打开一个文件(只适用于文本文件)
CloseFile:
关闭一个打开的文件
FileOpen:
打开一个特定的文件并返回文件句柄
FileCreate:
创建一个给定文件名的文件并返回文件句柄
FileClose:
关闭一个特定句柄的文件
后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。
它们操作的对象是文件句柄而不是文件变量。
6.1.4.2文件定位
Seek:
把文件当前位置移到指定部分
FilePos:
返回文件的当前位置
Eoln:
返回行结束标志
EOF:
返回文件结束标志
FileSeek:
改变当前文件指针的位置
Seek与FileSeek的区别是:
1.Seek仅用于记录文件;2.FileSeek的参数是文件句柄、偏移量、起始位置。
其中起始位置有文件首、当前位置、文件尾三种选择。
Seek的参数是文件变量、偏移量,偏移量是从文件首开始定位的。
3.FileSeek的偏移量以字节数来计算,而Seek是根据记录号进行移动。
Seek、FilePos仅用于记录文件。
但任何文件都可以看作是基于字节的记录文件。
下面一段程序表示了它们的用法。
{该例子的设计界面为一个包含TOpenDialog部件的窗体。
}
usesDialogs;
var
f:
fileofByte;
size:
Longint;
S:
String;
y:
Integer;
begin
ifOpenDialog1.Executethen
begin
AssignFile(f,OpenDialog1.FileName);
Reset(f);
size:
=FileSize(f);
S:
='Filesizeinbytes:
'+IntToStr(size);
y:
=10;
Canvas.TextOut(5,y,S);
y:
=y+Canvas.TextHeight(S)+5;
S:
='Seekinghalfwayintofile...';
Canvas.TextOut(5,y,S);
y:
=y+Canvas.TextHeight(S)+5;
Seek(f,sizediv2);
S:
='Positionisnow'+IntToStr(FilePos(f));
Canvas.TextOut(5,y,S);
CloseFile(f);
end;
end.
6.1.4.3文件删除与截断
Erase:
删除一个存在的文件
DeleteFile:
删除一个文件
Truncate:
从文件当前位置将文件截断
Erase与DeleteFile的区别是:
Erase以文件变量为参数,当文件不能删除时引起一个异常;DeleteFile以文件名为参数,当文件不存在或不能删除时返回False,而并不引起一个异常。
6.1.4.4文件名操作
Rename:
文件更名,以文件变量为操作对象
RenameFile:
文件更名,参数为文件的原名和新名
ChangeFileExt:
改变文件扩展名
ExpandFileName:
返回文件全路径名
ExtractFileExt:
返回文件扩展名
ExtractFileName:
从全路径名中返回文件名
ExtractFilePath:
返回特定文件的路径
6.1.4.5文件属性
FileGetAttr:
返回文件属性
FileSetAttr:
设置文件属性
6.1.4.6文件状态
FileSize:
返回文件对象大小
IOResult:
返回上一次I/O操作的状态
FileExists:
检测文件是否存在
6.1.4.7文件日期
DateTimeToFileDate:
把Delphi日期格式转换为DOS日期格式
FileDateToDateTime:
把DOS日期格式转换为Delphi日期格式
FileGetDate:
返回文件的DOS日期时间戳
FileSetDate:
设置文件的DOS日期时间戳
6.1.4.8文件读写
Read,Readln:
从文本或记录文件中读取变量
Write:
将指定变量写入文本或记录文件
Writeln:
将指定变量写入文本文件并写入一个行结束标志
FileRead:
从一个指定文件中读取变量
FileWrite:
向指定文件写入数据
FileRead和FileWrite都是以文件句柄为操作对象,主要供系统内部使用。
6.1.4.9目录操作
MkDir:
创建当前目录的子目录
ChDir:
改变当前目录
GetDir:
返回特定磁盘的当前目录
RmDir:
删除一个空子目录
6.1.4.10磁盘操作
DiskFree:
返回磁盘自由空间
DiskSize:
返回特定磁盘的大小
6.1.4.11文件查找
FileSearch:
查找目录中是否存在某一特定文件
FindFirst:
在目录中查找与给定文件名(可以包含匹配符)及属性集相匹配的第一个文件
FindNext:
返回符合条件的下一个文件
FindClose:
中止一个FindFirst/FindNext序列
有关文件管理标准过程/函数的更详细资料,请查阅Delphi相关的Help主题。
以上的大部分过程在后面都有应用实例,读者可以从中体会其用法。
在Delphi的联机帮助Help系统中把有关文件的过程/函数分为两个主题:
I/ORoutine和File_ManagementRoutine。
前者大部分以文件变量为操作对象,而后者大部分以文件名或文件句柄为操作对象。
这里为了方便读者的使用,我们按功能重新进行了分类。
在下一节中主要应用I/ORoutine主题下的过程,而在第四节的综合举例中主要应用File_ManagementRoutine主题下的过程。
另外,Windows提供了许多有关文件管理的API函数。
虽然在一般情况下,利用Delphi提供的函数已足够解决问题,但有时候仍然需要使用WindowsAPI。
在(6.4.4.2)中我们就用到了WindowsAPI函数GetDriveType。
有关WindowsAPI函数的情况,请读者参阅相关的资料,这里不再进行介绍。
6.2.1任务介绍
在这一节,我们开发一个系统安全性综合评估方法管理系统。
系统安全性在复杂项目开发中十分重要,但由于牵涉面广因而很难获得客观、全面的评估值。
鉴于此我们提出多角度、多侧面评估而后定量集成的思路,并在此基础上提出了多种安全性综合评估方法。
每种方法由不同部门进行评估而后把结果汇总、综合。
为此我们定义如下的记录类型:
type
TNature=(Micro,Macro);
{方法性质,分为微观和宏观两类}
TMethod=Record
Name:
string[20];{方法名}
Condition:
string[40];{方法适用条件}
Nature:
TNature;{方法性质}
Result:
Real;{方法评估值}
end;
用来记录不同方法的信息。
由于不同方法的条件、性质不同,因而对工程开发的不同阶段适用方法集也不同。
因此需要根据实际情况对方法集进行管理。
我们把每一方法作为一条记录,每一方法集作为一个记录文件。
下面讨论系统的实现方法。
6.2.2设计基本思路
本系统要实现的基本功能是文件的打开、创建、关闭、显示,记录的增加、修改、删除以及结果的综合和显示。
为此我们使用了两组按钮分别用于文件和记录的操作,使用一个StringGrid控件来显示文件内容,使用一个只读编辑框显示结果的综合。
其中各部件的名称、功能如下表所示:
表6.1主窗口部件的设计
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件名称主要属性备注
──────────────────────────────────────
RecFileFormBorderStyle=bsDialog文件打开后把文件名附到窗口标题后
Position=poScreenCenter
StringGrid1大小行数动态确定
HazAttr(编辑框)ReadOnly=True显示综合结果
OpenButtonTabOrder=0打开一个记录文件,若文件不存在则创建
NewButtonCaption='打开'创建一个记录文件,若文件存在则打开
CloseButtonCaption='关闭'关闭一个已打开的文件
AddButtonCaption='增加'增加一条记录
ModifyButtonCaption='修改'修改一条记录
DeleteButtonCaption='删除'删除一条记录
CalcuButtonCaption='计算'计算最终结果并显示
ExitButtonCaption='退出'系统终止。
若当前有打开的文件则先关闭
OpenDialog1Filter=选择或输入欲打开的文件
'RecordFile(*.Rec)|.Rec
|AnyFile(*.*)|*.*'
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
另外,StringGrid1、HazAttr的标题用两个标签框(Label)来显示。
另外我们还需要一个编辑对话框。
其中四个编辑框Name、Condition、Nature、Result分别对应TMethod记录的四个域。
为协调程序运行,我们定义了一组全局变量。
各变量的类型、作用如下表。
表6.2 全局变量及其作用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
变量名类型作用
─────────────────────────────────
MethodFileMethodFileType与当前打开文件相关联的文件变量
FileNamestring[70]当前打开文件的文件名
CountCount当前打开文件的记录总数
CurrentRecInteger当前处理记录号
FileOpenedBoolean当前是否有文件打开
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
记录文件类型MethodFileType的定义为
type
MethodFileType=fileofTMethod;
布尔变量FileOpened用于控制文件按钮的使能、变灰,记录按钮的反应以及系统结束时是否需要首先关闭文件。
6.2.3记录文件的打开和创建
记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤。
同文本文件唯一的不同是不能使用Append过程。
记录文件缺省情况下以读写方式打开,如果想以只读或只写方式打开,则需要修改System单元中定义的变量FileMode的值。
FileMode的取值和意义如下表。
表6.3FileMode的取值和意义
━━━━━━━━━━━━━━
取值意义
──────────────
0只读
1只写
2读写
━━━━━━━━━━━━━━
FileMode是一个全局变量,对它的每次修改都将影响所有Reset的操作,因此在打开自己的文件后应还原它的值。
在本系统中,当用户按下“打开”按钮时,首先弹出一个标准文件打开对话框,要求用户输入或选择文件名。
确认后如果该文件名的文件存在,则用Reset打开,若不存在则创建。
程序清单如下。
procedureTRecFileForm.OpenButtonClick(Sender:
TObject);
begin
ifOpenDialog1.Executethen
FileName:
=OpenDialog1.FileName
else
exit;
AssignFile(MethodFile,Filename);
try
Reset(MethodFile);
FileOpened:
=True;
except
OnEInOutErrordo
begin
try
ifFileExists(FileName)=Falsethen
begin
ReWrite(MethodFile);
FileOpened:
=True;
end
else
begin
FileOpened:
=False;
MessageDlg('文件不能打开',mtWarning,[mbOK],0);
end;
except
OnEInOutErrordo
begin
FileOpened:
=False;
MessageDlg('文件不能创建',mtWarning,[mbOK],0);
end;
end;
end;
end;
ifFileOpened=Falsethenexit;
Count:
=FileSize(MethodFile);
ifCount>0then
ChangeGrid;
RecFileForm.Caption:
=FormCaption+'--'+FileName;
NewButton.Enabled:
=False;
OpenButton.Enabled:
=False;
CloseButton.Enabled:
=True;
end;
首先系统试图用Reset打开一个文件,并置FileOpened为True。
如果文件不能打开,则引发一个I/O异常。
在异常处理过程中,首先检测文件是否存在。
若不存在则创建这个文件。
否则是其它原因引发的异常,则把FileOpend重置为False,并显示信息“文件不能打开”。
在文件创建过程中仍可能引发异常,因而在一个嵌套的异常处理中把FileOpened重置为False,并提示信息“文件不能创建”。
有关异常处理的内容请读者参看第十二章。
这段程序说明:
异常处理机制不仅能使我们的程序更健壮,而且为编程提供了灵活性。
当用户按下“创建”按钮时,系统首先弹出一个标准输入框,要求用户输入文件名,确认后系统首先检测文件是否存在。
若存在则直接打开,否则创建一个新文件。
打开或创建过程导致异常,则重置FileName和FileOpened两个全局变量。
procedureTRecFileForm.NewButtonClick(Sender:
TObject);
begin
FileName:
=InputBox('输入框','请输入文件名','');
ifFileName=''thenExit;
try
AssignFile(MethodFile,FileName);
ifFileExists(FileName)then
begin
Reset(MethodFile);
Count:
=FileSize(MethodFile);
ifCount>0then
ChangeGrid;
end
else
begin
Rewrite(MethodFile);
count:
=0;
end;
FileOpened:
=true;
Except
onEInOutErrordo
begin
FileName:
='';
FileOpened:
=False;
end;
end;
ifFileOpenedthen
begin
NewButton.Enabled:
=False;
OpenButton.Enabled:
=False;
CloseButton.Enabled:
=True;
RecFileForm.Caption:
=FormCaption+'--'+FileName;
end;
end;
当文件打开或创建后,所要做的工作有:
●若文件非空,则计算文件长度,并用文件内容填充StringGrid1
●“创建”、“打开”按钮变灰,“关闭”按钮使能
●把文件名附到窗口标题后
6.2.4记录文件的读入和显示
定义一个全局变量Count用来保存文件中的记录个数。
当文件装入时:
Count:
=FileSize(MethodFile);
如果Count>0,则首先确定StringGrid1的高度、行数。
为保证StringGrid1不会覆盖窗口下面的编辑框,定义一个常量MaxShow。
当Count
为保证滚动棒不覆盖掉显示内容,StringGrid1的宽度应留有余地。
确定StringGrid1高度、行数的代码如下:
WithStringGriddo
ifcount Height: =DefaultRowHeight*(Count+1)+10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 文件 管理