澳门最好的桑拿会所:Delphi文件操作

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 15:37:21
    变量的数据保存于内存中,随程序运行的结束而结束,若要使程序下次运行时能重复使用或给其他程序员使用,必须保存在文件中,Delphi存取文件的方式有4种,即传统的PASCAL方式、windows  API文件句柄方式、VCL文件流方式、使用类方法方式。使用类方法方式比较简单,其他三种方式一般的步骤为:    (1) 声明文件类型变量;    (2) 给文件类型变量指定文件名;    (3) 通过文件类型变量打开并且读写文件,必要时进行文件定位;    (4) 关闭文件。1、PASCAL方式访问文件    文件是由相同数据类型的数据元素组成的序列,文件可以分为三种类型:文本文件,类型文件,无类型文件。文本文件中每个数据元素就是一个字符,占有一个字节,并以回车换行符(#13#10)表示每行的结束;类型文件中每个数据元素的数据类型可以是整数、实型记录型等;无类型文件中每个数据元素是一个字节的二进制数。     文件和数组在形式上有些类似,但实质上有诸多不同,主要表现为以下三个方面:    (1)数组的元素个数一般是固定的,而文件的长度一般是不定的、随即的;    (2)数组元素总是放于内存中,而文件往往存于外存中;    (3)数组以“数组名[下标]”的形式访问数组中的任意一个元素,而文件则需要通过文件变量来访问。 1)类型文件例一、Button1按钮将记录数组XS[0..1]写入文件‘Stu.dat’,Button2将‘Stu.dat’读到记录变量X1,X2,然后用消息框输出。         TYPE  Stu = Record                     Xh:integer;                     Xm:string[20];         END;Procedure  TForm1.Buttonclick(Sender:TObject);//记录数组写入文件  Const  xs:array[0..1] of   Stu=((Xh:=405;xm:='张三'),(xh:=406,xm:='李四')); Var F:File of  Stu;  begin     AssignFile(F,'Stu.dat');//关联文件     ReWrite(F);//打开方式(写)     Write(F,xs[0],xs[1]);//将数组写到文件    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:array[0..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:array[0..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(const FileName: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;//读写位置的定位;    procedur FileClose(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,s[i],n); //用FOR循环调用FileWrite()函数每次写入N个字符,或FileWrite(Hnd,s[1],len);该方法可一次写入全部字符
  FileClose(Hnd);
end;procedure TForm1.Button8Click(Sender: TObject);
var
Hnd,n:integer;
i,len:LongWord;
buf:array[0..127] of Char;
begin
 Hnd:=FileOpen('new.txt',fMopenRead ); //以只读方式打开文件,并返回该文件的句柄存于Hnd
 len:=FileSeek(Hnd,0,2);//获取文件的长度(相对于文件尾);
  i:=0;
  Memo2.Clear ;
  While i  begin
    FileSeek(Hnd,i,0);//定位新读取的位置
    n:=FileRead(Hnd,Buf,127); //每次读取127个字符
    i:=i+n; //下次读取位置
    if n<127 then  BUF[n]:=#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(S[i],1);//memo3.lines.savetostream(F);直接将MEMO3的数据写入流中
  F.free;
end;procedure TForm1.Button10Click(Sender: TObject);
var
  F:TFileStream;
  len,i:integer;
  n:LongInt;
  Buf:array[0..127] of char;
begin
  F:=TFileStream.Create('xx.txt',fmOpenRead);
  //Meno4.lines.loadFromStrean(F);用类方法要简单很多
  len:=F.Seek(0,2);
  memo4.Clear ;
  i:=0;
  while i  begin
    F.Seek(i,0);
    n:=F.Read(Buf,127);
    i:=i+n;
    if n<127 then  buf[n]:=#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);
var
F:TFileStream;s:string;
begin
 F:=TFileStream.Create('xin.txt',fmOpenRead);
 SetString(s,nil,F.SIZE); //用HELP可以查看其功能,在此为设置变量S的长度为F.size
 F.Read(pointer(s)^,F.size);
 memo4.text:=s;
 F.free;
end; 4、使用类方法访问文件   Delphi在与文件有关的类中都定义了存取文件的方法,使用这些方法可以简单地实现将类中数据保存到文件中或从文件中读取数据到类。根据调用参数的不同又分为两类,其实两者都是通过刘实现的。   (1)以字符串作为调用参数的文件存取:LoadFromFile()和SaveToFile(),原型说明如下:     procedure  LoadFromFile/SaveToFile(const FileName:string);//从FileName指定的文件中读取数据/讲类型写到FileName指定的文件中    (2) 以流作为调用参数的文件存取:LoadFromStream()和SaveToStream原型说明如下:    Procedure   LoadFromStream/SaveToStream(Stream:TStream);    在TStrings、TGraphi 、TPicture类或派生类中都定义了以上四个方法,可方便地实现文件的存取,如TMEMO类中的LINES属性就定义了文件存取方法。 5、与文件目录相关的过程和函数   文件操作中除可用文件管理组件和通用对话框组件外,还可以使用标准过程和函数来获取或设置文件和目录有关的信息。1)目录操作(1) 获取当前目录 GetDir(D:byte;var S:string);//读取D:当前目录到变量S中;(2) 新建目录 procedure MKDir(const s:sring);创建S指定目录(3) 改变当前目录 procedure  ChDir(const s:string); 进入S指定目录(4) 删除子目录 procedure RmDir(const s:sring);删除S指定目录2)与文件操作有关的过程和函数function CetCurrentDir:string;//返回当前盘当前目录路径那个function SetCurrentDir(const Dir:string):Boolean;//设置当前目录路径,成功返回TRUEfunction  FileExists(const filename:string):Boolean;//判断文件是否存在function   DirectoryExists(const Directory:sring):Boolean;//判断目录是否存在function CreateDir(const Dir:string):Boolean;//创建子目录function  ExtractFileDir(const filename:string):string;//从文件中提取路径名function ReName(const oldName,NewName:string):Boolean;//文件改名function DeleteFile(Const Filename:string):Boolean;//删除指定文件function FileGetAttr(const filename:string):integer;//返回文件的属性function DiskSize(Drive:Byte):int64;//返回指定盘的总容量