Delphi 文件操作

ershen290 贡献于2013-11-22

作者 jbgw  创建于2011-04-29 02:34:00   修改者Sky123.Org  修改于2012-03-12 05:57:00字数31766

文档摘要:文件是同一种类型元素的有序集合,是内存与外设之间传输数据的渠道。文件的本质是一个数据流,所有的文件实际上是一串二进制序列。
关键词:

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:\delphi\program\extl.txt’);就将文件变量F和指定的文件e:\delphi\program\extl.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 eS 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 le类,并用它在文本文件中进行文本查询。本章还提供了一些关于选择驱动器、在树型目录中查询文件及获取文件版本信息的方法。本章将使你对文件、目录及驱动器有深入的认识。 处理文件的输入/输出 你将要对三种文件进行处理:文本文件、类型文件和二进制文件。 以下几节是关于文件输入/输出的讲解。文本文件指可被任意文本编辑器读取的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; Delphi关于记录文件的操作 本例子几个变量的说明 TFileRec = record   //记录定义 Day : Integer; ...  //其他定义 end; f : File of TFileRec;    //标准的输入/输出文件 FilRec : TFileRec;      //记录数据 FileName ;               //记录文件的名称 关于记录文件的相关操作 (1)记录文件的打开 (2)记录文件的读入和显示 (3)记录的增加 (4)记录的删除 (5)记录的修改 (6)记录文件的删除 1、记录文件的打开 需要使用的方法: AssingFile(f,FileName): Reset(f):         //打开一个已经存在的记录文件 Rewrite(f);         //新创建一个记录文件 FileSize(f);       //返回记录文件记录个数 procedure OpenRecFile(const FileName : string; var f : TFileRec); begin   AssingFile(f,FileName):   try     Reset(f);   except //打开文件出现异常的处理     On EInOutError do     begin       try         if FileExists(FileName) = False then //如果文件不存在,创建 ReWrite(MethodFile); else //文件存在,但是打不开,表示这个文件有问题 MessageDlg('文件不能打开',mtWarning,[mbOK],0); except //创建新文件的时候出现异常的处理 On EInOutError do MessageDlg('文件不能创建',mtWarning,[mbOK],0); end; end; end; 2、记录文件的读入 需要使用的方法 Read(f,FileRec); procedure ReadData_FromRecFile; begin for i := 1 to FileSize(f) do begin Read(f,FileRec); ...//其他的处理(比如记录的显示等等) end; end; 3、记录的增加 需要使用的方法 Seek(f,RecNo); //RecNo代表要定位置的记录编号 Write(f,FileRec) 基本思路: 获取指定记录的位置,并把该位置后的记录逐个向后移动 (1)在文件的尾部增加记录 procedure InsertData_AtRecFile_Last(const Data : TFileRec); //需要插入的数据 begin Seek(f,FileSize(f)); Write(f,Data); end; (2)在文件的指定位置前增加记录 procedure InsertData_AtRecFile(const Index : Integer); //索引号 const Data : TFileRec; //需要插入的数据 var nI : Integer; begin if (Index > FileSize(f)) or (Index < 0) then Exit; for nI := FileSize(f) - 1 downto Index do begin seek(f,nI); read(f,FileRec); Seek(f,nI + 1); Write(f,FileRec); end; Seek(f,Index); Write(f,Data); end; 4、记录的删除 需要使用的方法 Seek(f,Index); //Index代表要定位置的记录编号 Write(f,FileRec) Truncate(f) //删除指定索引号之后的索引文件 基本思路: 获取指定位置,并把该位置后的记录逐个向前移动。 文件在最后一条记录前截断。 (1)删除指定索引号的记录 procedure DeleteData_FromRecFile(const Index : Integer); var nI : Integer; begin if (Index < 0) or (FileSize(f) = 0) then Exit; for nI := Index + 1 to FileSize(f) - 1 do begin seek(f,nI); read(f,FileRec); seek(f,nI - 1); Write(f,FileRec); end; Seek(f,FileSize(f) - 1); //截断最后一条记录 Truncate(f); end; 5、记录的修改 procedure ModifyData_AtRecFile(const Index : Integer; const Data : TFileRec); begin if (Index < 0) or (FileSize(f) = 0) or (Index > FileSize(f) - 1) then Exit; Seek(f,Index); Write(f,Data); end; 6、记录文件的关闭 CloseFile(f); Delphi的文件操作 文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是我们主要讨论的对象。 Delphi继承了Object Pascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更多的文件管理函数。利用Delphi的强大功能,开发一个自己的文件管理系统就成为很容易的事。 首先介绍Delphi文件管理的基本概念和标准过程/函数,并提供了一个记录文件的应用实例,这是从我们实际课题开发中提取出来的。而后介绍Delphi提供的文件控件的使用方法。最后提供的一个综合例程MDI文件管理器则是对Delphi文件管理功能的综合应用。 1 文件类型和标准过程  Delphi同Object Pascal一样支持三种文件类型,即:文本文件、记录文件、无类型文件。 1.1文本文件  文本文件类型的变量用如下方法声明: var TextFileVar: Text ;  文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。  1.1.1 文本文件的打开、关闭  文本文件的打开需要两个步骤:(1). 文件变量与文件名关联;(2). 初始化读写。 联文件变量与文件名调用AssignFile标准过程:  AssignFile ( TextFileVar , FileName ) ;  FileName 既可以是全路径名,也可以仅是文件名。对于后者系统将在当前目录下查找。 AssignFile是Delphi新提供的一个函数,其功能等价于Object Pascal中的Assign。而Assign在Delphi中更多地被用作一个方法名。 初始化读写有三种方式: 1. Reset : 为读打开文件并把文件指针移动到文件首; 2. Rewrite : 为写创建一个新文件; 3. Append : 为写打开存在的文件并把文件指针定位在文件尾。 当使用Reset或Append过程而文件不存在时将会引发一个I/O异常。 文件的关闭很简单,只须调用CloseFile过程即可。 虽然Delphi应用程序在退出时会自动关闭所有打开的文件,但自己动手关闭文件可以确保释放文件句柄,并使程序的可移植性增强。 为保持兼容,Delphi也允许用户用Assign建立关联,Close关闭文件。  1.1.2 文本文件的读写  从文本文件中读取信息用Read、Readln两个标准过程。 当读入数值时,Read、Readln假定数值是用一个或多个空格分开的,而不是逗号、分号或其它字符。对如下一条语句:  Read ( TextFileVar , Num1 , Num2 , Num3 ) ;  如果文件中的数值是: 100 200 300 则能够成功读入,而若文件中的数值是 100 200, 300 则Read读入“200,”并试图把它转化成一个数值时会引发一个异常。 当读入字符是字符串时,Read、Readln过程总是读取尽可能多的字符填充到字符串变量中或一直读到行结束符为止。因此从文本文件中读取格式化的字符串数据,必须声明与其长度相匹配的字符串变量。如果要从文件中读取单词,必须先把文件中的每一行读入字符串,然后再从字符串中逐个分析出单词。或者一次只从文本文件中读入一个字符并测试每个字符后是否是单词断开处。 格式化字符串之间的分隔符应读入到一个临时变量中,而字符串与数值、数值与数值间的分隔符读入时会自动识别剔除。对如下一行数据: Mon 12:10 40 50 定义  var Day: string[3] ; Time: string[5] ; Num1, Num2: Integer ; 则须用如下的read 语句读入:  read ( TextFileVar , Day , c , Time , Num1 , Num2 ) ;  C为一个临时字符变量。  1.1.3 文本文件的编辑  在Delphi中实现对一个文本文件的编辑,只须让其与一个Tmemo控件建立关联即可:  Memo1.Lines.LoadFromFile ( TextFileName ) ;  这样在TMemo上所做的一切修改当调用Memo部件的SaveToFile方法后都会反映到文件中去。  1.2 记录文件  记录文件是一种操作更为灵活的文件类型。它允许同时为读和写打开,而且由于记录文件中每条记录的长度固定,所以可随机存取。 记录文件的类型变量可如下声明:  var RecordFileVar: file of RecordType;  RecordType是一个自定义的记录类型。 1.3 无类型文件  无类型文件提供了底层的I/O通道,可用于存取可变长度记录的文件。经常用于文件的复制操作中。由于Delphi提供了更好的方法,所以无类型文件很少使用。有兴趣的读者可参看BlockRead、BlockWrite两个联机帮助主题。  1.4 Delphi的文件管理标准过程  根据功能我们把标准过程划分为十一类进行介绍。  1.4.1 文件的打开与关闭  AssignFile :把一个外部文件名和一个文件变量相关联 Reset :打开一个存在的文件 Rewrite :创建并打开一个新文件(或覆盖原有文件) Append :以添加方式打开一个文件(只适用于文本文件) CloseFile : 关闭一个打开的文件 FileOpen :打开一个特定的文件并返回文件句柄 FileCreate :创建一个给定文件名的文件并返回文件句柄 FileClose :关闭一 Append :以添加方式打开一个文件(只适用于文本文件) CloseFile : 关闭一个打开的文件 FileOpen :打开一个特定的文件并返回文件句柄 FileCreate :创建一个给定文件名的文件并返回文件句柄 FileClose :关闭一个特定句柄的文件  后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。它们操作的对象是文件句柄而不是文件变量。  1.4.2 文件定位  Seek :把文件当前位置移到指定部分 FilePos : 返回文件的当前位置 Eoln : 返回行结束标志 EOF : 返回文件结束标志 FileSeek : 改变当前文件指针的位置 Seek与FileSeek的区别是: 1. Seek仅用于记录文件; 2. FileSeek的参数是文件句柄、偏移量、起始位置。其中起始位置有文件首、当前位置、文件尾三种选择。Seek的参数是文件变量、偏移量,偏移量是从文件首开始定位的。 3. FileSeek的偏移量以字节数来计算,而Seek是根据记录号进行移动。 Seek、FilePos仅用于记录文件。但任何文件都可以看作是基于字节的记录文件。下面一段程序表示了它们的用法。 { 该例子的设计界面为一个包含TOpenDialog部件的窗体。}  程序代码uses Dialogs; var f: file of Byte; size: Longint; S: String; y: Integer; begin if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Reset(f); size := FileSize(f); S := 'File size in bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Seeking halfway into file...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Position is now ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f); end; end.  1.4.3 文件删除与截断  Erase : 删除一个存在的文件 DeleteFile : 删除一个文件 Truncate :从文件当前位置将文件截断  Erase与DeleteFile的区别是:Erase以文件变量为参数,当文件不能删除时引起一个异常;DeleteFile以文件名为参数,当文件不存在或不能删除时返回False,而并不引起一个异常。  1.4.4 文件名操作  Rename :文件更名,以文件变量为操作对象 RenameFile :文件更名,参数为文件的原名和新名 ChangeFileExt :改变文件扩展名 ExpandFileName :返回文件全路径名 ExtractFileExt :返回文件扩展名 ExtractFileName :从全路径名中返回文件名 ExtractFilePath :返回特定文件的路径  1.4.5 文件属性  FileGetAttr :返回文件属性 FileSetAttr :设置文件属性  1.4.6 文件状态  FileSize :返回文件对象大小 IOResult :返回上一次I/O操作的状态 FileExists :检测文件是否存在  1.4.7 文件日期  DateTimeToFileDate :把Delphi日期格式转换为DOS日期格式 FileDateToDateTime :把DOS日期格式转换为Delphi日期格式 FileGetDate :返回文件的DOS日期时间戳 FileSetDate :设置文件的DOS日期时间戳  1.4.8 文件读写  Read,Readln :从文本或记录文件中读取变量 Write :将指定变量写入文本或记录文件 Writeln :将指定变量写入文本文件并写入一个行结束标志 FileRead :从一个指定文件中读取变量 FileWrite :向指定文件写入数据  FileRead和FileWrite都是以文件句柄为操作对象,主要供系统内部使用。  1.4.9 目录操作  MkDir :创建当前目录的子目录 ChDir :改变当前目录 GetDir :返回特定磁盘的当前目录 RmDir :删除一个空子目录  1.4.10 磁盘操作  DiskFree :返回磁盘自由空间 DiskSize :返回特定磁盘的大小  1.4.11 文件查找 FileSearch :查找目录中是否存在某一特定文件 FindFirst :在目录中查找与给定文件名(可以包含匹配符)及属性集相匹配的第一个文件 FindNext :返回符合条件的下一个文件 FindClose :中止一个FindFirst / FindNext序列  有关文件管理标准过程/函数的更详细资料,请查阅Delphi相关的Help主题。以上的大部分过程在后面都有应用实例,可以从中体会其用法。 在Delphi的联机帮助Help系统中把有关文件的过程/函数分为两个主题:I/O Routine和File_Management Routine。前者大部分以文件变量为操作对象,而后者大部分以文件名或文件句柄为操作对象。这里为了方便使用,我们按功能重新进行了分类。在下一节中主要应用I/O Routine主题下的过程,而在第四节的综合举例中主要应用File_Management Routine主题下的过程。 另外,Windows提供了许多有关文件管理的API函数。虽然在一般情况下,利用Delphi提供的函数已足够解决问题,但有时候仍然需要使用Windows API。 关于文件、目录操作 FileExists('c:\test.txt') Deletfile('abc.txt');//删除文件 Renamefile('old.txt','new.txt');//文件更名 Delphi 中如何改目录的名字 RenameFile('c:', 'c:'); ChangeFileExt(Application.ExeName, '.LOG') // 修改文件扩展名 ExtractFilename(filelistbox1.filename);//取文件名 ExtractFileExt(filelistbox1.filename);//取文件后缀 ExtractFilePath ExtractRelativePath // 取相对路径 ExtractShortPathName // 转化长文件名为短文件名 ExpandFileName 合并文件名 DirectoryExists('c:\') Chdir('c:\abcdir');转到目录 Mkdir('dirname');建立目录 ForceDirectories('e:\test\test\test'); 创建多级目录 Rmdir('dirname');删除目录 RemoveDir('c:\test') GetCurrentDir;//取当前目录名,无'\' SetCurrentDir('c:\111'); Getdir(0,s);//取工作目录名s:='c:\abcdir'; SelectDirectory() ExtractFileDriver // 取驱动器号 ExtractFileDir(Application.Exename); // 得到程序的路径 SysUtils 单元中有 ExtractFileDir 与 ExtractFilePath两个类似的函数, 用哪一个?没有太 大的关系。 不过有以下的差别: ExtractFilePath 传回值的最後一个字元是反斜杠"/"。 文本文件 var myTextFile: TextFile; s: string; begin AssignFile(myTextFile, 'MyTextFile.txt'); reset(myTextFile); try while Not(Eof(myTextFile)) do begin ReadLn(myTextFile, s); ShowMessage(s); end; finally CloseFile(myTextFile); end; end; 这时,可以进行第二步;打开文件。有三种方式可以打开文件:使用Rewite过程创建 并打开文件;对于一个已存在的文件,此操作将使文件被覆盖;使用Reset过程只读地打开 一个文件:使用Append过程可以向已存在的文件追加文本。注意Reset将以可读写方式打开 类型文件和无类型文件。 类型文件 TPerson = packed record FirstName: string[20]; LastName: string[20]; Age: integer; SocialCode: integer; end; var PersonFile:file of TPerson; Person: TPerson; begin assignfile(PersonFile, 'PersonFile.dat'); reset(PersonFile); try if not Eof(PersonFile) then read(PersonFile, Person); finally CloseFile(PersonFile); end; end; 追加记录 var PersonFile: file of TPerson; Person: TPerson; begin assignfile(PersonFIle, 'PersonFile.dat'); reset(PersonFile); seek(PersonFIle, FileSize(PersonFile)); try write(PersonFile, Person); finally CloseFile(PersonFile); end; end; 无类型文件 var UnTypedFile: file; Buf: array[0..128] of byte; Num: integer; begin assignfile(UnTypedFile, 'UnTypedFile.dat'); reset(UnTypedFile); try BlockRead(UnTypedFile, Buf, Num); finally CloseFile(UnTypedFile); end; end; 写入文件 var UnTypedFile: file; Buf: array[0..128]; Num: integer; begin assignfile(UntypedFile); reset(UnTypedFile); if FileExists('UnTypedFile.dat') then Reset(UnTypedFile); else Rewrite(UnTypedFile); try Seek(UnTypedFile, FileSize(UnTypedFile)); FillChar(Buf, SizeOf(buf), 'Y'); BlockWrite(UnTypedFile, Buf, 1, Num); finally CloseFile(UnTypedFile); end; end; TFileStream的操作 //从文件流当前位置读count字节到缓冲区BUFFER function read(var buffer;count:longint):longint;override; //将缓冲区BUFFER读到文件流中 function write(const buffer;count:longint):longint;override; //设置文件流当前读写指针为OFFSET function seek(offset:longint;origin:word):longint;override; origin={soFromBeginning,soFromCurrent,soFromEnd} //从另一文件流中当前位置复制COUNT到当前文件流当前位置 function copyfrom(source:TStream;count:longint):longint; //读指定文件到文件流 var myFStream:TFileStream; begin myFStream:=TFileStream.create(OpenDialog1.filename,fmOpenRead); end; 处理文件属性 attr:=filegetattr(filelistbox1.filename); if (attr and faReadonly)=faReadonly then ... //只读 if (attr and faSysfile)=faSysfile then ... //系统 if (attr and faArchive)=faArchive then ... //存档 if (attr and faHidden)=faHidden then ... //隐藏 取得WINDOWS目录 uses shellapi; var windir:array[0..255] of char; getwindowsdirectory(windir,sizeof(windir)); 或者从注册表中读取,位置: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion SystemRoot键,取得如:C:\WINDOWS 得到WINDOWS的SYSTEM路径: 方法: var MySysPath : PCHAR ; begin GetMem(MySysPath,255); GetSystemDirectory(MySysPath,255); FreeMem(MySysPath, 0); end; 注:MySysPath为SYSTEM路径 如何取得Windows的临时文件目录? Windows 95 & NT都指定了放置临时文件的目录,然而,用户能改变临时目录的位置而不使用缺 省的目录。这篇文章的目的是告诉你如何得到Windows 95 & NT当前的临时目录位置。这个 Windows API函数 GetTempPath就是解决这个问题的。其函数原形为: DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer); 下面的例子示范如何使用: function GetTempDirectory: String; var TempDir: array[0..255] of Char; begin GetTempPath(255, @TempDir); Result := StrPas(TempDir); end; 备注:临时目录的确定原则: 1,如果有TMP环境变量则临时目录为TMP指定的目录 2,如果没有TMP环境变量而有TEMP环境变量,则为TEMP变量指定的目录 3,如果TMP和TEMP都没有定义,则取当前目录为临时目录 得到执行程序的目录 procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ExtractFileDir(Application.Exename)); // ie: c: ShowMessage(ExtractFilePath(Application.Exename)); // ie: c:\parend; 相同点: 如果执行文件在根目录下(如:C:.EXE)的话, 两者的传回值相同, 且最后一个字符 都是"/"。 使用GetFileVersionInfo 得到版本信息的例子 procedure GetBuildInfo(var V1, V2, V3, V4: Word); var VerInfoSize: DWORD; VerInfo: Pointer; VerValueSize: DWORD; VerValue: PVSFixedFileInfo; Dummy: DWORD; begin VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, ', Pointer(VerValue), VerValueSize); with VerValue^ do begin V1 := dwFileVersionMS shr 16; V2 := dwFileVersionMS and $FFFF; V3 := dwFileVersionLS shr 16; V4 := dwFileVersionLS and $FFFF; end; FreeMem(VerInfo, VerInfoSize); end; 计算一个目录的大小 function GetDirectorySize(const ADirectory: string): Integer; var Dir: TSearchRec; Ret: integer; Path: string; begin Result := 0; Path := ExtractFilePath(ADirectory); Ret := Sysutils.FindFirst(ADirectory, faAnyFile, Dir); if Ret <> NO_ERROR then exit; try while ret=NO_ERROR do begin inc(Result, Dir.Size); //如果是目录,且不是'.'或'..'则进行递归调用 if (Dir.Attr in [faDirectory]) and (Dir.Name[1] <> '.') then Inc(Result, GetDirectorySize(Path + Dir.Name + '\*.*')); Ret := Sysutils.FindNext(Dir); end; finally Sysutils.FindClose(Dir); end; end; 清空一个目录 function EmptyDirectory(TheDirectory :String ; Recursive : Boolean) : Boolean; var SearchRec : TSearchRec; Res : Integer; begin Result := False; TheDirectory := NormalDir(TheDirectory); Res := FindFirst(TheDirectory + '*.*', faAnyFile, SearchRec); try while Res = 0 do begin if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin if ((SearchRec.Attr and faDirectory) > 0) and Recursive then begin EmptyDirectory(TheDirectory + SearchRec.Name, True); RemoveDirectory(PChar(TheDirectory + SearchRec.Name)); end else begin DeleteFile(PChar(TheDirectory + SearchRec.Name)) end; end; Res := FindNext(SearchRec); end; Result := True; finally FindClose(SearchRec.FindHandle); end; end; 使用readln()从文件中读出超过255字符的字串 Type {use longest line you may encounter here} TLine = Array [0..1024] of Char; PLine = ^TLine; Var pBuf: PLine; ... New( pBuf ); ... ReadLn( F, pBuf^ ); 向文本文件后追加一行 var filevar: textfile; buf:string; begin assignfile(filevar,'txt.log'); append(filevar); writeln(filevar,buf); closefile(filevar); end; ------------------------------------------------------------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FileCtrl, System.ComponentModel, system.Text; type TForm1 = class( TForm ) Button1 : TButton; Button2 : TButton; Button3 : TButton; Button4 : TButton; Button5 : TButton; Button6 : TButton; Button7 : TButton; Button8 : TButton; procedure Button1Click( Sender : TObject ); procedure Button2Click( Sender : TObject ); procedure Button3Click( Sender : TObject ); procedure Button4Click( Sender : TObject ); procedure Button5Click( Sender : TObject ); procedure Button6Click( Sender : TObject ); procedure Button7Click( Sender : TObject ); procedure Button8Click( Sender : TObject ); private { Private declarations } public { Public declarations } end; var Form1 : TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click( Sender : TObject ); const SELDIRHELP = 1000; var Dir : string; begin Dir := 'C:\'; if SelectDirectory( Dir, [ sdAllowCreate, sdPerformCreate, sdPrompt ], SELDIRHELP )then Caption := Dir; end; procedure TForm1.Button2Click( Sender : TObject ); begin Caption := ExtractFilePath( Application.ExeName ); ShowMessage( ExtractFileDir( Application.ExeName ) ); end; procedure TForm1.Button3Click( Sender : TObject ); var aa : stringbuilder; begin aa := stringbuilder.Create( 255 ); GetTempPath( 255, aa ); Caption := aa.ToString; aa.Free; end; procedure TForm1.Button4Click( Sender : TObject ); var MySysPath : StringBuilder; begin MySysPath := stringbuilder.Create( 255 ); GetSystemDirectory( MySysPath, 255 ); Caption := MySysPath.ToString; MySysPath.Free; end; procedure TForm1.Button5Click( Sender : TObject ); var MySysPath : StringBuilder; begin MySysPath := stringbuilder.Create( 255 ); GetWindowsDirectory( MySysPath, 255 ); Caption := MySysPath.ToString; MySysPath.Free; end; procedure TForm1.Button6Click( Sender : TObject ); var Dir : string; begin Dir := 'C:\Test\111\222'; if ForceDirectories( Dir )then Caption := Dir + ' was created' end; procedure TForm1.Button7Click( Sender : TObject ); var dir, tmpstr : String; begin dir := 'c:\TempTest'; MkDir( dir ); RenameFile( dir, dir + 'tmp' ); ChDir( dir + 'tmp' ); GetDir( 3, tmpstr ); Caption := tmpstr; chdir( '\' ); removedir( tmpstr ); SetCurrentDir( tmpstr ); ShowMessage( getCurrentDir ); end; procedure TForm1.Button8Click( Sender : TObject ); begin if not DirectoryExists( 'c:\temp' )then if not CreateDir( 'C:\temp' )then raise Exception.Create( 'Cannot create c:\temp' ); end; end. Delphi文件操作所涉及的一些函数   //判断文件是否存在 FileExists //判断文件夹是否存在 DirectoryExists //删除文件 DeleteFile; Windows.DeleteFile //删除文件夹 RemoveDir; RemoveDirectory //获取当前文件夹 GetCurrentDir //设置当前文件夹 SetCurrentDir; ChDir; SetCurrentDirectory //获取指定驱动器的当前路径名 GetDir //文件改名 RenameFile //建立文件夹 CreateDir; CreateDirectory; ForceDirectories //删除空文件夹 RemoveDir; RemoveDirectory //建立新文件 FileCreate //获取当前文件的版本号 GetFileVersion //获取磁盘空间 DiskSize; DiskFree //搜索文件 FindFirst; FindNext; FindClose //读取与设置文件属性 FileGetAttr; FileSetAttr //获取文件的创建时间 FileAge; FileDateToDateTime Delphi代码 //判断文件是否存在 FileExists    var     f: string;    begin     f := 'c:"temp"test.txt';      if not FileExists(f) then     begin      //如果文件不存在      end;    end;       --------------------------------------------------------------------------------          //判断文件夹是否存在 DirectoryExists    var     dir: string;    begin     dir := 'c:"temp';      if not DirectoryExists(dir) then     begin      //如果文件夹不存在      end;    end;       --------------------------------------------------------------------------------          //删除文件 DeleteFile; Windows.DeleteFile    var     f: string;    begin     f := 'c:"temp"test.txt';    //DeleteFile(f);  //返回 Boolean       //或者用系统API:      Windows.DeleteFile(PChar(f)); //返回 Boolean    end;       --------------------------------------------------------------------------------          //删除文件夹 RemoveDir; RemoveDirectory    var     dir: string;    begin     dir := 'c:"temp';      RemoveDir(dir); //返回 Boolean       //或者用系统 API:      RemoveDirectory(PChar(dir)); //返回 Boolean    end;       --------------------------------------------------------------------------------          //获取当前文件夹 GetCurrentDir    var     dir: string;    begin     dir := GetCurrentDir;      ShowMessage(dir); //C:"Projects    end;       --------------------------------------------------------------------------------          //设置当前文件夹 SetCurrentDir; ChDir; SetCurrentDirectory    var     dir: string;    begin     dir := 'c:"temp';      if SetCurrentDir(dir) then       ShowMessage(GetCurrentDir); //c:"temp       //或者      ChDir(dir); //无返回值       //也可以使用API:      SetCurrentDirectory(PChar(Dir)); //返回 Boolean    end;       --------------------------------------------------------------------------------          //获取指定驱动器的当前路径名 GetDir    var     dir: string;      b: Byte;    begin     b := 0;      GetDir(b,dir);      ShowMessage(dir); //       //第一个参数: 1、2、3、4...分别对应: A、B、C、D...    //0 是缺省驱动器    end;       --------------------------------------------------------------------------------          //文件改名 RenameFile    var     OldName,NewName: string;    begin     OldName := 'c:"temp"Old.txt';      NewName := 'c:"temp"New.txt';         if RenameFile(OldName,NewName) then       ShowMessage('改名成功!');       //也可以:      SetCurrentDir('c:"temp');      OldName := 'Old.txt';      NewName := 'New.txt';        if RenameFile(OldName,NewName) then       ShowMessage('改名成功!');       //也可以:      SetCurrentDir('c:"temp');      OldName := 'Old.txt';      NewName := 'New.txt';         if RenameFile(OldName,NewName) then       ShowMessage('改名成功!');    end;       --------------------------------------------------------------------------------          //建立文件夹 CreateDir; CreateDirectory; ForceDirectories    var     dir: string;    begin     dir := 'c:"temp"delphi';      if not DirectoryExists(dir) then       CreateDir(dir); //返回 Boolean       //也可以直接用API:      CreateDirectory(PChar(dir),nil); //返回 Boolean       //如果缺少上层目录将自动补齐:      dir := 'c:"temp"CodeGear"Delphi"2007"万一';      ForceDirectories(dir); //返回 Boolean    end;       --------------------------------------------------------------------------------          //删除空文件夹 RemoveDir; RemoveDirectory    var     dir: string;    begin     dir := 'c:"temp"delphi';      RemoveDir(dir); //返回 Boolean       //也可以直接用API:      RemoveDirectory(PChar(dir)); //返回 Boolean    end;       --------------------------------------------------------------------------------          //建立新文件 FileCreate    var     FileName: string;      i: Integer;    begin     FileName := 'c:"temp"test.dat';      i := FileCreate(FileName);         if i>0 then       ShowMessage('新文件的句柄是: ' + IntToStr(i))      else       ShowMessage('创建失败!');    end;       --------------------------------------------------------------------------------          //获取当前文件的版本号 GetFileVersion    var     s: string;      i: Integer;    begin     s := 'C:"WINDOWS"notepad.exe';      i := GetFileVersion(s); //如果没有版本号返回 -1      ShowMessage(IntToStr(i)); //327681 这是当前记事本的版本号(还应该再转换一下)    end;       --------------------------------------------------------------------------------          //获取磁盘空间 DiskSize; DiskFree    var     r: Real;      s: string;    begin     r := DiskSize(3); //获取C:总空间, 单位是字节      r := r/1024/1024/1024;      Str(r:0:2,s); //格式为保留两位小数的字符串      s := 'C盘总空间是: ' + s + ' GB';      ShowMessage(s); //xx.xx GB         r := DiskFree(3); //获取C:可用空间      r := r/1024/1024/1024;      Str(r:0:2,s);      s := 'C盘可用空间是: ' + s + ' GB';      ShowMessage(s); //xx.xx GB    end;       //查找一个文件 FileSearch    var     FileName,Dir,s: string;    begin     FileName := 'notepad.exe';      Dir := 'c:"windows';      s := FileSearch(FileName,Dir);         if s<>'' then       ShowMessage(s) //c:"windows"notepad.exe      else       ShowMessage('没找到');    end;       --------------------------------------------------------------------------------          //搜索文件 FindFirst; FindNext; FindClose    var     sr: TSearchRec;    //定义 TSearchRec 结构变量      Attr: Integer;     //文件属性      s: string;         //要搜索的内容      List: TStringList; //存放搜索结果    begin     s := 'c:"windows"*.txt';      Attr := faAnyFile;             //文件属性值faAnyFile表示是所有文件      List := TStringList.Create;    //List建立         if FindFirst(s,Attr,sr)=0 then //开始搜索,并给 sr 赋予信息, 返回0表示找到第一个      begin       repeat                       //如果有第一个就继续找          List.Add(sr.Name);         //用List记下结果        until(FindNext(sr)<>0);      //因为sr已经有了搜索信息, FindNext只要这一个参数, 返回0表示找到      end;      FindClose(sr);                 //需要结束搜索, 搜索是内含句柄的         ShowMessage(List.Text);        //显示搜索结果      List.Free;                     //释放List       //更多注释:    //TSearchRec 结构是内涵文件大小、名称、属性与时间等信息    //TSearchRec 中的属性是一个整数值, 可能的值有:    //faReadOnly  1   只读文件    //faHidden    2   隐藏文件    //faSysFile   4   系统文件    //faVolumeID  8   卷标文件    //faDirectory 16  目录文件    //faArchive   32  归档文件    //faSymLink   64  链接文件    //faAnyFile   63  任意文件       //s 的值也可以使用?通配符,好像只支持7个?, 如果没有条件就是*, 譬如: C:"*    //实际使用中还应该在 repeat 中提些条件, 譬如判断如果是文件夹就递归搜索等等    end;       --------------------------------------------------------------------------------          //读取与设置文件属性 FileGetAttr; FileSetAttr    var     FileName: string;      Attr: Integer; //属性值是一个整数    begin     FileName := 'c:"temp"Test.txt';      Attr := FileGetAttr(FileName);      ShowMessage(IntToStr(Attr)); //32, 存档文件       //设置为隐藏和只读文件:      Attr := FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_HIDDEN;      if FileSetAttr(FileName,Attr)=0 then //返回0表示成功        ShowMessage('设置成功!');       //属性可选值(有些用不着):    //FILE_ATTRIBUTE_READONLY = 1; 只读    //FILE_ATTRIBUTE_HIDDEN = 2; 隐藏    //FILE_ATTRIBUTE_SYSTEM = 4; 系统    //FILE_ATTRIBUTE_DIRECTORY = 16    //FILE_ATTRIBUTE_ARCHIVE = 32; 存档    //FILE_ATTRIBUTE_DEVICE = 64    //FILE_ATTRIBUTE_NORMAL = 128; 一般    //FILE_ATTRIBUTE_TEMPORARY = 256    //FILE_ATTRIBUTE_SPARSE_FILE = 512    //FILE_ATTRIBUTE_REPARSE_POINT = 1204    //FILE_ATTRIBUTE_COMPRESSED = 2048; 压缩    //FILE_ATTRIBUTE_OFFLINE = 4096    //FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192; 不被索引    //FILE_ATTRIBUTE_ENCRYPTED = 16384    end;       --------------------------------------------------------------------------------          //获取文件的创建时间 FileAge; FileDateToDateTime    var     FileName: string;      ti: Integer;      dt: TDateTime;    begin     FileName := 'c:"temp"Test.txt';      ti := FileAge(FileName);      ShowMessage(IntToStr(ti)); //返回: 931951472, 需要转换         dt := FileDateToDateTime(ti); //转换      ShowMessage(DateTimeToStr(dt)); //2007-12-12 14:27:32    end;  

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档