Delphi文件的学习

-------------

资料有点乱,忘记出处了

-----------------

var file_name:string; file_name:='c:luther.gliethttp.txt'; FileWrite(com.log_fd, PChar(file_name)^, length(file_name)); 文件是同一种类型元素的有序集合,是内存与外设之间传输数据的渠道。文件的本质是一个数据流,所有的文件实际上是一串二进制序列。 文件管理包括:1、文件操作。2、目录操作。3、驱动器操作。三部分。 1、常见文件操作函数和过程。 1.1、AssignFile过程 作用:将一个外部文件的文件名与一个File类型的变量关联,并对变量进行初始化。 原型:procedure AssignFile(var F; FileName: String); F:一个File类型的变量,可以是任何数据类型。 FileName:外部文件的文件名。 1.2、FileExists函数 作用:用于测试指定文件名的文件是否存在。 原型:function FileExists(const FileName: String): Boolean; FileName:文件名。字符串类型。 注意:如果文件存在,返回True;否则,返回False。 1.3、Append过程 作用:为在一个已经存在的文件末尾添加文本做好准备工作。文件是只写方式打开的。 原型:procedure Append(var F: Text); F: 一个TextFile类型变量。 注意:这是一个对文本类型文件操作的过程。其中变量F必须和外部文件关联。如果F没有与外部文件关联,将抛出异常。如果F已经处于打开状态,则过程会关闭F并重新打开。文件指针位置将被设置在文件末尾。 1.4、Reset过程 作用:对于文本文件,Reset过程将以只读方式打开文件。对于类型文件和无类型文件,Reset过程将以可读写方式打开文件。 原型:procedure Reset(var F [: File; RecSize: Word ] ); F:File类型变量,可以是任何文件类型。 RecSize:文件的大小。它是一个可选的选项,只有当F为无类型文件时才可以被指定。如果F为无类型文件,则RecSize指定了在数据传输过程中使用的记录的大小。如果参数RecSize被省略了,则默认的记录大小为128字节。 注意:当该过程打开文件时,如果文件不存在则产生异常。如果文件已经打开了,则先关闭文件,然后重新打开,并将文件指针放到文件开头处。默认的文件模式 (FileMode)为2,即可读写模式。如果文件模式在调用Reset过程前都还未改变,则尝试打开一个只读文件会失败。当调用Reset过程后,如果 文件为空,则Eof函数返回True,否则返回False。 1.5、Rewrite过程 作用:对于一个已存在的文件,此操作将使文件被覆盖。对于一个不存在的文件,将创建并打开文件。对于一个已打开的文件,则关闭文件,并重新创建一个新的文件(覆盖原有的)。文件指针也被设置到空文件的开头处。 原型:procedure Rewrite(var F: File [; Recsize: Word ] ); F:File类型变量,可以是任何文件类型。 RecSize:文件的大小。它是一个可选的选项,只有当F为无类型文件时才可以被指定。如果F为无类型文件,则RecSize指定了在数据传输过程中使用的记录的大小。如果参数RecSize被省略了,则默认的记录大小为128字节。 注意:如果F被指定为一个空的文件名,如:AssignFile(F, ‘’),那么当Rewrite过程被调用时,F为标准的输出文件。如果F是文本文件,则F为只写模式。当调用Rewrite过程后,Eof(F)将总是为True。 1.6、Flush函数 作用:用于清空以输出方式打开的文本缓冲区,保证所有写入的字符全部写入外部文件。 原型:function Flush(var t: Text): Integer; F:F是文本类型变量。 注意:本函数只使用于文本文件的处理。当操作成功时,Flush返回0,否则,它将返回错误代码。当使用Rewrite过程或者Append过程打开一个 文本文件用来输出时。Flush函数用于清空文件的缓冲区。这个过程保证了缓冲区的中的所有字符都已经写入外部文件中。对于因为输入而打开的文 件,Flush函数不起任何作用。 1.7、Read过程 作用:用于从一个文件中读取数据。 原型:procedure Read(F , V1 [, V2,...,Vn ] ); procedure Read( [ var F: Text; ] V1 [, V2,...,Vn ] ); F:是一个文件变量。 V1……Vn:用于存储从文件中读取的数据。 注意:在Delphi中,Read过程有两种语法,如果参数F是一个有类型文件,过程Read读取一组数据到一个变量中。如果参数F是一个文本文件变量,过程Read读取一个或多个值到一个或多个变量中。 1.8、ReadLn过程 作用:用于从文件中读取一行文本。 原型:procedure ReadLn([ var F: Text; ] V1 [, V2, ...,Vn ]); V:文本文件变量。 V1……V2:用于存储读取的文本。 注意:在Delphi中,ReadLn过程用于读取文本文件的一行文本,并跳至该文本文件的下一行。 1.9、Write过程 作用:用于向一个文本文件写入数据。 原型:procedure Write( [var F: Text; ] P1 [ , P2,..., Pn] ); //文本类型文件 procedure Write(F, V1,…Vn); //有类型文件 F:文本文件比变量。 P1……Pn:代表向文件中写入的数据。 注意:对于文本文件来说,写入的内容应String类型变量。对于有类型文件来说,写入的必须是某种特定类型的数据。 1.10、WriteLn过程 作用:用来向文本文件中添加一行内容,即在写入内容后面有回车换行符。 原型:procedure WriteLn([ var F: Text; ] P1 [, P2, ...,Pn ] ); F:文本文件比变量。 1.11、Eof函数 作用:用于判断是否到了文件的结尾。 原型:function Eof(var F): Boolean; //用于类型文件和无类型文件 function Eof [ (var F: Text) ]: Boolean; //用于文本文件 典型应用:如果文件为空或当前位置在最后一个字符后,则返回True;否则,返回False。 1.12、Eoln函数 作用:测试文件指针是否指向一行的最后,适用于文本文件。如果当前的位置在一行的末尾或Eof(F)函数返回的是True,则Eoln返回的是True;否则返回False。 原型:function Eoln [(var F: Text) ]: Boolean; 典型应用:在程序中对文本文件进行操作时,有时需要限制数据的读取。如果只读取一行中某个位置到一行结束的部分数据。程序中可以使用Eoln函数进行判断。 1.13、CloseFile过程 作用:用来关闭文件,同事将文件记录盘上的文件与相关文件变量断开联系。 原型:procedure CloseFile(var F); F:一个文件类型变量 注意:通常来说,CloseFile过程与try…finally…模块结合使用。 1.14、DeleteFile函数 作用:将一个文件从记录盘上删除。 原型:function DeleteFile(const FileName: string): Boolean; 注意:如果文件不存在或无法删除,返回False;否则,返回True。 1.15、Erase过程 作用:用于删除一个已存在的文件。 原型:procedure Erase(var F); 注意:如果文件被打开,先关闭文件再执行删除操作。 1.16、FileGetAttr函数 作用:用于获取一个文件的属性设置。 原型:function FileGetAttr(const FileName: string): Integer; 注意:具体返回值代码参考帮助。 下面我们来总结一下Delphi中文件操作流程。Delphi中把文件分为3种:文本文件、类型文件和无类型文件。文本文件指可以被任意文件编辑器读取的ASCII文件。类型文件包含由程序员定义的数据类型的文件。无类型文件包含了其他所有的文件类型。 1、文本文件 Step 1 调用AssignFile()将文件变量与一个关联起来。如: AssignFile(MyTextFile,’TextFile.txt’); Step 2 打开文件。有三种打开文件的方式:1.Rewrite过程创建并打开文件,对于一个已经存在的文件,此操作将使文件被覆盖;2.使用Reset过程只读地打开一个文件;3.使用Append过程向已经存在的文本文件追加文本。 Step 3 对文件进行操作。如Write或Read操作。 Step 4 使用CloseFile来关闭一个已经打开的文件。 下面是一个文本文件操作的示例。 例1: 复制内容到剪贴板 代码: procedure TForm1.Button1Click(Sender: TObject); var MyTextFile: TextFile; //定义变量MyTextFile为文本文件类型 begin (*步骤1,将文件变量与外部文件联系。相当于为外部文件找了个“替身”*) AssignFile(MyTextFile, ‘TextFile.txt’); (*判断操作的文件是否存在,不存在则创建文件。*) if FileExists(‘TextFile.txt’) then (*步骤2,打开文件,不过在打开前,最好进行文件是否存在的判断。*) Append(MyTextFile) else Rewrite(MyTextFile); try (*步骤3,对文件进行操作。*) WrtieLn(MyTextFile, ‘在文件末尾添加的文字!’); Flush(MyTextFile); //清空缓冲区,确保字符串已经写入文件之中。 finally (*步骤4,关闭打开的文件,CloseFile常与try…finally搭配,用于回收资源 *) CloseFile(MyTextFile); end; end; 2、类型文件 Step 1 定义数据结构 Step 2 调用AssignFile()将文件变量与一个类型文件关联起来。 Step 3 打开类型文件。 Step 4 对类型文件进行操作。 Step 5 关闭已经打开的文件。 下面例子演示了类型文件的操作。 例2: 复制内容到剪贴板 代码: (*步骤1,定义数据结构。*) type TPerson = record Name: string[20]; Sex: string[4] Age: Integer; End; procedure TForm1.Button1Click(Sender: TObject); var PersonFile: file of TPerson; //声明PersonFile变量为TPerson类型文件 Person: TPerson; begin (*步骤2,关联文件。*) AssignFile(PersonFile, ‘Person.dat’); (*步骤3,打开文件。 *) Reset(PersonFile); try While not Eof(PersonFile) do (*步骤4,对文件进行操作。*) begin Read(PersonFile, Person); Memo1.Lines.Add(Person.Name); Memo1.Lines.Add(Person.Sex); Memo1.Lines.Add(IntToStr(Person.Age)); end; finally (*步骤5,关闭文件。*) CloseFile(PersonFile); end; end; ===================================================================== Delphi中默认有input和output两个文件变量,使用可以不用定义,直接使用. 但: input:只读 output:只写 用时注意以免引起异常. 引自http://www.zxbc.cn/html/delphijc/2206462260151.html 文件是由文件名标识的一组数据的集合,文件通常存放在磁盘上。源程序、学生档案记录、图形、音乐等均可以作为文件存储在磁盘上。操作系统是以文件为单位对 数据进行管理的,也就是说,如果想读取外存介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外存介质上存储数据,也必须先 建立一个文件(以文件名标识),才能向它输出数据。 在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。 1.文件类型 file是一个文件类型说明符,通过file可以定义文件变量,也可以定义一些新的类型。在Delphi中支持下面3种类型的文件:即文本文件、类型文件和无类型文件(也称二进制文件)。下面依次介绍3种文件类型变量的定义及使用方法。 Delphi程序设计中,对任何一种文件的操作都可以归纳为:建立_打开_读/写_关闭。 2. 文本文件 2.1 文本文件的概念 在Delphi中定义了TextFile类型表示文本文件,由字符的ASCII码组成,最小存取单位为字符。文本文件也称为ASCII码文件。利用常见的文字编辑器可以浏览支件内容。 文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。在一个打开的文本文件上同时进行读、写操作是不允许的。 2.2 文本文件变量的定义 定义文件变量的语法格式如下: var <文件变量名>:TextFile; 例如,Var myTextFile : TextFile;就定义了一个文本文件变量myTextFile,下面就可以通过此变量引用一个文本文件。 2.3 文本文件的使用 (1)文件变量与文件关联 在使用文件变量进行文件操作之前,需要将文件变量与要操作的文件关联,即给文件变量名赋值。文件变量赋值可以使用过程AssignFile,过程的说明语法格式如下: procedure AssignFile(Var F;FileName:string); 其中,F为文件变量名,定义为无类型参数是为了和所有文件类型兼容;FileName是文件名字符串,是包括路径的文件全称名。例 如,AssignFile (F,'e:delphiprogramextl.txt’);就将文件变量F和指定的文件e:delphiprogramextl.txt 关联起来。后面所有对变量f的操作都是对指定文件的操作。 (2)使用文件变量打开文件 使用不同的过程打开文件,有3种方式: procedure Rewrite(var F~File[;recsize:word]); 这个过程创建并打开文件,可以对文件进行写。这里的F是一个已经和指定文件名关联的文件变量。对于一个已存在的文件,此操作将覆盖原文件;如果文件不存在,将建立一个新的空文件。若是类型文件(下一小节介绍),可用recsize指定大小。· procedure Reset(var F:File[;RecSize:Word]); 使用Reset过程以读的方式打开一个文件,此时只能从文件中读取数据。f为文件变量,打开文件后,文件指针指向文件开头。如果试图用reset过程打开一个不存在的文件时,将有I/O错误产生。 procedure.Append(var F:’Fext); 使用Append过程向已存在的文件追加文本,这个过程仅用于文本文件。当用append过程打开文件时,文件指针指向文件的尾部,此后输入的数据将添加在文件原有数据的后面。该过程打开的文件(即F关联的文件)必须存在,否则也将出现I/O错误。 (3)读/写文件 ①读取文件内容。在以读的方式打开文件后,可以使用read和readln语句来读取文件内容,其声明代码格式分别为: procedure read([var F:’Fext;]V1[,V2,…,Vn]); procedure readln([var F:’text;]v1[,V2,···,Vn]); 其中,F为文件变量。v1、v2、…、vn等为需要输入的变量,其类型可以为字符串、字符、整数和实数类型。read和readln的区别为后者在读取数据后,将文件指针移至下一行,上次读取的数据与回车符之间的数据被忽略。 当读取字符串时,必须用readln过程,否则读完一行数据后,再使用read读取字符串将得到空串。当读取整型和实型数据时,文件中的数据用空格分隔,且必须符合数据格式,否则将产生I/O错误。 在读取文件时,还必须判断文件指针是否已到文件尾部,此时可以用Eof函数进行判断,其声明代码如下: function Eof[(‘var F:’rext)]:Boolean; 当文件指针指到尾部时,该函数返回值为true。 ②向文件写入数据。以写的方式打开文件后,即可向其中写入数据,写人数据使用write和writeln过程,其声明代码如下: procedure wri‘teln([var F:’rext;]p 1[,p2,…,pn]); procedure write([var F:‘rext;]p 1[,p2,‘·‘,pn]); 与read相似,p 1、p2、…、pn等为需要输出的变量,可以是字符串、字符、整数和实数类型。一writeln在写入数据后还会附加上回车和换行符,而下次要写入的数据将写在新的一行。 写人数据时系统自动将数据转化为字符串形式,1)~ASCII码的形式保存在文件中。 (4)使用文件变量关闭文件 无论是输入或输出,在对文件操作完成后,都应关闭文件。关闭文件使用CloseFile过程,其声明代码如下: procedure CloseFile(var F); 关闭文件后,系统释放打开文件时使用的资源。特别是写文件时,在调用write和writeln过程时,数据先写入内存缓冲区,只有在缓冲区满或关闭文件时,才把数据真正写入磁盘文件中,因此写完数据后不关闭文件可能丢失数据。 例2.15 使用Rewrite()过程在程序运行的当前目录下创建一个文本文件file.txt,并向文件中增加5行文本。 Var textf:TextFile; //定义文件变量textf S:String; i:Integer; 1 ‘ begin ‘ AssignFile(textf,’file.txt’); //将文件变量textf与当前目录中的“file.txt"文件关联 Rewrite(textf); //创建文件或打开已存在的文件进行覆盖 for i:=1 to 5 do 1 ● begin S:=’This is Line#’; writeln(textf,s,i); end; CloseFile(textf); //关闭已打开的文件textf end. 被创建的文件中包含5行文本,如第3行为:This is line#3。 若要向一个已存在的文件追加新文本,应将其中的rewrite改为append。以上程序是向文件中写入字符串和整数。其实,Object Pascal对于所有的数据类型都可以这样处理。下面的程序演示了从文本文件中读取数据的方法。 写入文件 Var F : Textfile; //申明变量 Begin AssignFile(F,'c:ek.txt'); //让变量F和C:ek.txt关连 ReWrite(F); {Create a new file named ek.txt} Writeln(F,'你要写入文本文件的内容'); //写入文件 Closefile(F); //释放变量F End; 读取文件 Var F : Textfile; str:String; Begin AssignFile(F, 'c:ek.txt'); {Assigns the Filename} Reset(F); {Opens the file for reading} Readln(F, str); ShowMessage('1. line of textfile:' +str); Closefile(F); {Closes file F} End; 下面转自http://blog.csdn.net/xwchen/archive/2007/07/26/1710410.aspx var f:text; ... AssignFile(f,'c:1.txt'); ReWrite(f); Writeln(f,'This is a test'); CloseFile(f); ... 其中Rewrite是新建文件,若换成Reset则为打开文件 Writeln为行写入并换行,Write为写入不换行,Readln为读一行并换行,Read为读但不换行 delphi 读写文件方法有很多种: 我送你一贴: 程序设计当中我们时常遇到需要处理文件、目录及驱动器的情况,本章将对如何处理不同类型的文件进行讲述。本章包括如何使用T F i l e S t r e a m 类封装文件的输入/输出以及如何利用3 2 位Wi n d o w s 的主要特征—内存映射文件。你将学习到如何创建一个封装了内存映射文件功能的T M e m o r y M a p p e d F i l e类,并用它在文本文件中进行文本查询。本章还提供了一些关于选择驱动器、在树型目录中查询文件及获取文件版本信息的方法。本章将使你对文件、目录及驱动 器有深入的认识。 处理文件的输入/输出 你将要对三种文件进行处理:文本文件、类型文件和二进制文件。 以下几节是关于文件输入/输出的讲解。文本文件指可被任意文本编辑器读取的A S C I I 文本。类型文件指包含由程序员定义的数据类型的文件。二进制文件包含了其他所有的类型,它是对包含任意格式或无格式数据的文件的统称。 文本文件的处理 本节讲述使用内建于Object Pascal 运行时库中的过程和函数处理文本文件的方法。在对文本文件进行任何处理之前,首先要打开此文本文件。声明变量:通过此变量可以来引用一个文本文件。 打 开一个文件需要两步:首先是A s s i g n F i l e ( ) ,它可以将文件变量与一个文件关联起来。例如:这时,你可以进行第二步:打开文件。有三种方式打开文件:使用R e w r i t e ( )过程创建并打开文件;对于一个已存在的文件,此操作将使文件被覆盖;使用R e s e t ( )过程只读地打开一个文件;使用Append() 过程向已存在的文件追加文本。 注意Reset()将以可读写方式打开类型文件和无类型文件。可以使用C l o s e F i l e ( )来关闭一个已打开的文件。下例是各种调用的函数。 文件的打开与关闭 AssignFile :把一个外部文件名和一个文件变量相关联 Reset :打开一个存在的文件 Rewrite :创建并打开一个新文件(或覆盖原有文件) Append :以添加方式打开一个文件(只适用于文本文件) CloseFile :关闭一个打开的文件 FileOpen :打开一个特定的文件并返回文件句柄 FileCreate :创建一个给定文件名的文件并返回文件句柄 FileClose :关闭一个特定句柄的文件 后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。它们操作的对象是文件句柄而不是文件变量。 文件定位 Seek:把文件当前位置移到指定部分 FilePos:返回文件的当前位置 Eoln:返回行结束标志 EOF:返回文件结束标志 FileSeek: 改变当前文件指针的位置 还有个问题,如何判断文件已打开?要不要读写完之后就关闭文件,下次读或者写时再打开? 正常情况下是这样 用TFileStream 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家。(申明:非本人所写) 1. 将Byte数组生成文件 procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string ); var Count: integer; F: FIle of Byte; pTemp: Pointer; begin AssignFile( F, FileName ); Rewrite(F); try Count := Length( ByteArray ); pTemp := @ByteArray[0]; BlockWrite(F, pTemp^, Count ); finally CloseFile( F ); end; end; 2. 将文件生成Byte数组 function FiIeToByteArray(const FileName:string ):TByteDynArray; const BLOCK_SIZE=1024; var BytesRead,BytesToWrite,Count:integer; F:File of Byte; pTemp:Pointer; begin AssignFile( F, FileName ); Reset(F); try Count := FileSize( F ); SetLength(Result, Count ); pTemp := @Result[0]; BytesRead := BLOCK_SIZE; while (BytesRead = BLOCK_SIZE ) do begin BytesToWrite := Min(Count, BLOCK_SIZE); BlockRead(F, pTemp^, BytesToWrite , BytesRead ); pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE); Count := Count-BytesRead; end; finally CloseFile( F ); end; end; function Encrypt(mStr: string; mKey: string): string; var I, J: Integer; begin J := 1; Result := ''; for I := 1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J])); if J + 1 <= Length(mKey) then Inc(J) else J := 1; end; {自己加步骤} end; function Decrypt(mStr: string; mKey: string): string; var I, J: Integer; begin J := 1; Result := ''; {自己加步骤} for I := 1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J])); if J + 1 <= Length(mKey) then Inc(J) else J := 1; end; end; procedure TForm1.Button1Click(Sender: TObject); const cKey1 = '谁想试试怎么破'; cKey2 = '我可不愿意这样玩(1)我可不愿意这样玩(2)我可不愿意这样玩(3)'; cKey3 = 'Memo2.Text := Decrypt(Encrypt(Memo1.Text, cKey), cKey);'; var S: string; //加密后的字符 begin S := Encrypt(Encrypt(Encrypt(Memo1.Text, cKey1), cKey2), cKey3); ShowMessage(S); Memo2.Text := Decrypt(Decrypt(Decrypt(S, cKey3), cKey2), cKey1); end;

原文地址:https://www.cnblogs.com/dmqhjp/p/14155696.html