Delphi文件操作.doc_第1页
Delphi文件操作.doc_第2页
Delphi文件操作.doc_第3页
Delphi文件操作.doc_第4页
Delphi文件操作.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

Delphi文件操作变量的数据保存于内存中,随程序运行的结束而结束,若要使程序下次运行时能重复使用或给其他程序员使用,必须保存在文件中,Delphi存取文件的方式有4种,即传统的PASCAL方式、windows API文件句柄方式、VCL文件流方式、使用类方法方式。使用类方法方式比较简单,其他三种方式一般的步骤为: (1) 声明文件类型变量; (2) 给文件类型变量指定文件名; (3) 通过文件类型变量打开并且读写文件,必要时进行文件定位; (4) 关闭文件。1、PASCAL方式访问文件 文件是由相同数据类型的数据元素组成的序列,文件可以分为三种类型:文本文件,类型文件,无类型文件。文本文件中每个数据元素就是一个字符,占有一个字节,并以回车换行符(#13#10)表示每行的结束;类型文件中每个数据元素的数据类型可以是整数、实型记录型等;无类型文件中每个数据元素是一个字节的二进制数。 文件和数组在形式上有些类似,但实质上有诸多不同,主要表现为以下三个方面: (1)数组的元素个数一般是固定的,而文件的长度一般是不定的、随即的;(2)数组元素总是放于内存中,而文件往往存于外存中;(3)数组以“数组名下标”的形式访问数组中的任意一个元素,而文件则需要通过文件变量来访问。1)类型文件例一、Button1按钮将记录数组XS0.1写入文件Stu.dat,Button2将Stu.dat读到记录变量X1,X2,然后用消息框输出。 TYPE Stu = Record Xh:integer; Xm:string20; END;Procedure TForm1.Buttonclick(Sender:TObject);/记录数组写入文件 Const xs:array0.1 of Stu=(Xh:=405;xm:=张三),(xh:=406,xm:=李四);Var F:File of Stu; begin AssignFile(F,Stu.dat);/关联文件 ReWrite(F);/打开方式(写) Write(F,xs0,xs1);/将数组写到文件 CloseFile(F); end;procedure TForm1.Button2Click(Sender: TObject);Var F:File of Stu; x1,x2:Stu;begin AssignFile(F,Stu.dat); ReSet(F); /打开方式(读) Read(F,x1,x2); /从文件中读到记录 CloseFile(F);/关闭F指定文件 showmessageFmt(%d,%s;%d,%s,x1.xh,x1.xm,x2.xh,x2.xm);end; 2)文本文件例二、Button3将EDIT1指定库名写入文件DBN.txt,Button4将DBN.txt读到变量DBN,然后用消息框输出。procedure TForm1.Button3Click(Sender: TObject);Var F:TextFile; DBN:string;begin DBN:=edit1.text; AssignFile(F,ExtractFilePath(Application.ExeName)+DBN.txt); Rewrite(F); Writeln(F,DBN);/写入一行字符创到变量DBN CloseFile(F);end;procedure TForm1.Button4Click(Sender: TObject);Var F:textfile; DBN:string;begin AssignFile(F,ExtractFilePath(Application.ExeName)+DBN.txt); ReSet(F); Readln(F,DBN);/读取一行字符创到变量DBN CloseFile(F); Showmessage(DBN);end;注意:有类型文件操作的函数一般有:read函数,write函数,EOF函数:判断文件是否结束;而文本文件除了这些函数之外还有readln函数:读取一行字符串,writeln函数:写一行字符串,EOLN:判断是否为文件行尾,Append函数,以追加方式打开文件。 3)无类型文件通过文件数据块和写入数据块的过程原型说明如下:procedure BlockRead(Var F :File;const buf;Count:integer;var Result:integer);procedure BlockWrite(Var F :File;const buf;Count:integer;var Result:integer);/参数BUF为要读取或写入的数据缓冲区,COUNT为读或写的数据块的数目;/Result返回实际读或写如的数据;/数据块的大小默认为128个字节,调用RESET和REWRITE可以设置参数指定读入或写入的字节个数;读取位置定位的过程原型说明如下:procedure seek(var F:file;N:Longint)例三、Button5将缓冲区BUF中的数据写入无类型文件abc.txt,Button5将abc.txt读到MEMO1,然后用消息框输出。procedure TForm1.Button5Click(Sender: TObject);var F:file;/定义为无类型文件 n:integer; BUF:array0.127 of Char;begin AssignFile(F,abc.txt); ReWrite(F,16);/写方式且块的大小为16个字节; FillChar(BUF,Sizeof(BUF),A);/缓冲区BUF用A填充,共128个字节 BlockWrite(F,Buf,9,n); /写入9块,末尾16个字符为乱码 CloseFile(F); /写完文件后文件大小为9*16=144字节 Showmessage(写入的块的个数为:+inttostr(n); /输出为9,但有效的为8块*16=128个字节end;procedure TForm1.Button6Click(Sender: TObject);Var F:file; n:integer; BUF:array0.127 of Char;begin AssignFile(F,abc.txt); Reset(F,16); BlockRead(F,buf,10,n);/读取10块,实际9块 closefile(F); Showmessage(inttostr(n); Memo1.Lines.Add(buf); /有效字符8块,128个字符end;2、Windows API方式访问文件 使用WINDOW 提供的API函数通过句柄也可以访问文件,他们在DELPHI中的SysUnit单元中的定义如下: function FileCreate(constFileName:string;Rights:integer):integer;/创建新文件并返回句柄; function FileOpen(const File Name:string;Mode:LongWord):integer;/打开文件并返回句柄; function FileRead(Handle:integer;VarBuf;Count:LongWord):integer;/从文件中读取数据; function FileWrite(Handle:integer;const buf;Count:Longword):integer;/将数据写入文件; function FileSeek(Handle:integer;const offsetLint64;origin:integer):int64;/读写位置的定位; procedurFileClose(Handle:integer);/关闭Handle指定文件句柄相应的文件;其中fileopen()函数MODE参数的大尅文件方式和共享文件方式常量如下: FmCreate /用指定的文件名创建,若文件已经存在则打开 FmOpenRead /只读方式打开,以下都在SYSUNITS中定义 FmOpenWrite /只写方式打开 FmopenReadWrite/读写方式打开 FmShareCompact /DOS兼容模式不可抑制 FmshareExclusive/独占方式 FmShareDenyWrite/拒绝其他进程写 FmShareDenyRead /拒绝其他进程读,不支持所有平台 FmShareDenyNone /允许其他进程读或写FileSeek()函数用于改变文件要读写的当前位置,OFFSET参数用于设置该变量,ORIGIN参数用于设置改变的相对位置,当ORIGIN为0时意味着OFFSET移动的字节数相对于文件头,为1时意味着相对于当前位置,为2时意味着OFFSET相对于文件尾,一般返回相对于文件头的心的当前位置,若返回-1表示发生异常。例四、BUTTON7将MEMO1中文本写入文件new.txt,button8将new.txt内容读到MEMO2中;procedure TForm1.Button7Click(Sender: TObject);var Hnd,n:integer; s:string; Len,i:Longint;begin s:=Memo1.Text; Len:=Length(s); n:=1; Hnd:=FileCreate(new.txt); /创建文件new.txt并返回句柄 for i:=1 to len do FileWrite(Hnd,si,n); /用FOR循环调用FileWrite()函数每次写入N个字符,或FileWrite(Hnd,s1,len);该方法可一次写入全部字符 FileClose(Hnd);end;procedure TForm1.Button8Click(Sender: TObject);varHnd,n:integer;i,len:LongWord;buf:array0.127 of Char;beginHnd:=FileOpen(new.txt,fMopenRead ); /以只读方式打开文件,并返回该文件的句柄存于Hndlen:=FileSeek(Hnd,0,2);/获取文件的长度(相对于文件尾); i:=0; Memo2.Clear ; While ilen do begin FileSeek(Hnd,i,0);/定位新读取的位置 n:=FileRead(Hnd,Buf,127); /每次读取127个字符 i:=i+n; /下次读取位置 if n127 then BUFn:=#0;/最后一次读不足127个字符时设置串结束标志 Memo2.text:=memo2.Text+buf;/追加到MEMO2中 end;end;3、VCL流方式访问文件 在面向对象语言中文件的访问逐渐趋向使用数据流来实现,流不仅可以出来文件,还可以处理动态内存、网络数据等多种数据形式。 数据流(stream)是一组有顺序的、有起点和终点的字节集合,是对数据传输的总称(或抽象)。数据流有读写两个方向,由外设到内存为读,由内存到外设为写。每个数据流都有一个缓冲区以提高传输效率。 TStream类是所有流的基类,其中定义了所有流的共同属性和方法,其主要属性如下: (1)position:控制当前流中存取指针的位置;(2)size:指定一次读写流数据的字节数; 在TSTREAM中定义的方法有两类:一类是虚方法,这些方法在其子类中通常被覆盖,以处理不同存储方式的数据,而在使用流时,则不必使用这些方法;另一类是静态方法,如COPyFORM,这些方法利用虚方法对流进行不同的操作。TSTREAM中定义的方法主要有以下几种: (1) read :读取指定书目的字节到缓冲区,并自动控制流指针的位置,原型说明如下:function read(var:Buffer,Count:Longint):Longint:virtual;abstrcact;/读Count字节到BUFFER;(2)Write:向流中写入数据,并自动控制流指针的位置,原型说明如下: function Write(Const Buffer;Count:Longint):Longint;virtual;abstrat;/将OUNT字节写到BUFFER; (3) SEEK 方法:将文件流指针安ORIGIN指定位置移到OFFSET指定的字节数,原型说明如下: function seek(offset:Longint;origin:word):Longint;overload;virtual;/参数意义同API句柄方式; (4) CopyFrom 方法:从Source流复制COUNT字节的数据到当前流,若COUNT=0;则表示复制所有数据,原型说明如下: function CopyFrom(Source:Tstream;Count:int64):int64; 由于TSTREAM类的方法是虚方法,所有在其拍摄类中必须覆盖相应的方法,常用的派生类有如下几种; (1) TFileStream:文件操作流,用于已知文件名的文件访问 (2) TStringStream 字符串流,用于内存字符串的操作 (3) TMemoryStream 内存流,用于管理内存的地址 (4) TBlobStream 块操作流面对BLOB类进行操作(5) TWinSocketStream 用于以SOCKET方式连接的数据流的读写操作 (6) TOleStream 用于COM接口的读写操作 用TFileStream类进行文件存取要经过4个步骤:定义TFileStreanm类对象;创建类对象并指定文件名和打开方式;引用类方法进行文件操作;释放类对象。例五、Button9将MEMO3内容读入xx.txt,BUTTON10将xx.txt的内容读到MEMO4。procedure TForm1.Button9Click(Sender: TObject);var F:TFileStream;i:integer;s:string;begin F:=TFileStream.Create(xx.txt,fmCreate);/创建类对象 S:=memo3.Text; for i:=1 to length(s) do F.Write(Si,1);/memo3.lines.savetostream(F);直接将MEMO3的数据写入流中 F.free;end;procedure TForm1.Button10Click(Sender: TObject);var F:TFileStream; len,i:integer; n:LongInt; Buf:array0.127 of char;begin F:=TFileStream.Create(xx.txt,fmOpenRead); /Meno4.lines.loadFromStrean(F);用类方法要简单很多 len:=F.Seek(0,2); memo4.Clear ; i:=0; while ilen do begin F.Seek(i,0); n:=F.Read(Buf,127); i:=i+n; if n127 then bufn:=#0; Memo4.Text:=memo4.Text+buf; end;end;用数据流和STRING类型直接实现例六、BUTTON11将MEMO3内容读入xx.txt,BUTTON12将xx.txt的内容读到MEMO4。procedure TForm1.Button11Click(Sender: TObject);var F:TFileStream; S:string;begin F:=TFileStream.Create(xin.txt,fmCreate); S:=memo3.Text; F.Write(pointer(s),Length(s); F.Free;end;procedure TForm1.Button12Click(Sender: TObject);varF:TFileStream;s:string;beginF:=TFileStream.Create(xin.txt,fmOpenRead);SetString(s,nil,F.SIZE); /用HELP可以查看其功能,在此为设置变量S的长度为F.sizeF.Read(pointer(s),F.size);memo4.text:=s;F.free;end;4、使用类方法访问文件 Delphi在与文件有关的类中都定义了存取文件的方法,使用这些方法可以简单地实现将类中数据保存到文件中或从文件中读取数据到类。根据调用参数的不同又分为两类,其实两者都是通过刘实现的。 (1)以字符串作为调用参数的文件存取:LoadFromFile()和SaveToFile(),原型说明如下: procedure LoadFromFile/SaveToFile(constFileName:string);/从FileName指定的文件中读取数据/讲类型写到FileName指定的文件中 (2)以流作为调用参数的文件存取:LoadFromStream()和SaveToStream原型说明如下: Procedure LoadFromStream/SaveToStream(Stream:TStream); 在TStrings、TGraphi、TPicture类或派生类中都定义了以上四个方法,可方便地实现文件的存取,如TMEMO类中的LINES属性就定义了文件存取方法。5、与文件目录相关的过程和函数 文件操作中除可用文件管理组件和通用对话框组件外,还可以使用标

温馨提示

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

评论

0/150

提交评论