Delphi的文本文件操作类源码

来源:互联网 发布:windows 10 whql 编辑:程序博客网 时间:2024/05/10 07:22
Delphi中的文件操作就象pascal语法一样,拖沓和啰嗦,开始编程时学的第一个编程语言就是pascal,不幸到现在对于文件操作都是看书才能完成。哎。。。。想了一下办法,不如将对文件的操作封装成类,一来可以方便使用,二来,再写对文件操作的代码的时候,可以当作示例。

一个不完整的类TSafTextFile,实现了对TextFile的基本读写功能,欢迎同仁们完善和补充。

//********************************************************************
//
// Name   : Sinoprise Function Library For Delphi
//
//Author  :     Shuguang Yin
//              Sinoprise Technology Lab
//Create  :     2005-11-15
//
// Official WebSite   : http://www.sinoprise.com
// Sinoprise Technology Community : http://www.usenix.cn
//
//********************************************************************
unit SAF_TextUnit;

interface
uses
        windows,SysUtils;
const
        SAF_OPEN_FILE_RESULT_OK = 0;         //0 正常
        SAF_OPEN_FILE_RESULT_FILE_EXIST = -1; //-1 文件已经存在
        SAF_OPEN_FILE_RESULT_FILE_NOT_EXIST = -2;//-2 文件不存在
        SAF_OPEN_FILE_RESULT_CREATE_FILE_ERROR = -3;//-3 创建文件失败
        SAF_OPEN_FILE_RESULT_OPEN_FILE_ERROR = -4;//-4 打开文件失败
        SAF_OPEN_FILE_RESULT_FILE_ALREADY_OPEN = -5;//-5 文件已经打开
        SAF_OPEN_FILE_RESULT_UNKNOWN_ERROR = 1;//未知的错误
type
        TSafOpenFileOpt = (
                        sofFileCreate,  //创建文件,当文件存在时出错
                        sofFileOpenReadOnly, //以只读方式打开,当文件不存在时出错
                        sofFileOpenReadWrite,    //打开文件,当文件不存在时出错
                        sofFileOpenCreate,  //当文件存在时,打开文件,当文件不存在时创建文件
                        sofFileAppendOnly,  //打开文件准备添加数据,如果文件不存在,则报错
                        sofFileAppendCreate,//当文件存在时,以追加的方式打开文件,当文件不存在时创建文件
                        sofFileRewriteCreate//当文件存在时,覆盖文件,当文件不存在时创建文件
        );

        ESafTextFileExcetpion = class(Exception)
        private
                FErrorCode: integer;
                FDescribe: string;
                FFileName: string;
                FOpenFileOption: TSafOpenFileOpt;
        public
                property OpenFileOption : TSafOpenFileOpt read FOpenFileOption;
                property FileName : string read FFileName;
                property ErrorCode : integer read FErrorCode;
                property Describe : string read FDescribe;
                constructor Create(fn:string;ofo:TSafOpenFileOpt;ec:integer;des:string );
        end;

        TSafTextFile = class
        private
                FTextFile:TextFile;
                FFileName: string;
                FOpenFileOption: TSafOpenFileOpt;
                FFileOpen : boolean;
                function GetSeekEOF: boolean;
                function GetSeekEOL: boolean;

        public
                Function ReadLine:string;
                Procedure WriteLine(value:string);
                Function Read:string;
                Procedure Write(value:string);
                //返回值:
                //>0 正确移动的行数
                //=0 文件当前指针未移动
                function MoveNextLines(nMvLines:integer=1):integer;
                //文件是否结束
                property EOF : boolean read GetSeekEOF;
                //行是否结束
                property EOL : boolean read GetSeekEOL;
                //打开文件时的参数
                property OpenFileOption : TSafOpenFileOpt read FOpenFileOption;
                //文件名
                property FileName : string read FFileName;

                //此函数,当文件存在时,打开文件,文件不存在时,创建文件
                constructor Create(AFileName:string;openopt:TSafOpenFileOpt);
                destructor Destroy;override;
        end;

implementation

{ TSafTextFile }

constructor TSafTextFile.Create(AFileName: string;openopt:TSafOpenFileOpt);
var
        fexist : boolean;
begin
        AssignFile(FTextFile,AFileName);
        FFileName:=AFileName;
        FOpenFileOption:=openopt;
        FFileOpen := false;
        fexist := FileExists(AFileName);
        case  openopt of
        //创建文件,当文件存在时出错
        sofFileCreate: begin
                if fexist then  begin
                        raise ESafTextFileExcetpion.Create(FFileName,FOpenFileOption,
                                SAF_OPEN_FILE_RESULT_FILE_EXIST,'文件已经存在');
                end;
                rewrite(FTextFile);
        end;
        //以只读方式打开,当文件不存在时出错
        sofFileOpenReadOnly: begin
                if not fexist then begin
                        raise ESafTextFileExcetpion.Create(FFileName,FOpenFileOption,
                                SAF_OPEN_FILE_RESULT_FILE_NOT_EXIST,'文件不存在');
                end;
                Reset(FTextFile);
        end;
        //打开文件,当文件不存在时出错
        sofFileOpenReadWrite:begin
                if not fexist then begin
                        raise ESafTextFileExcetpion.Create(FFileName,FOpenFileOption,
                                SAF_OPEN_FILE_RESULT_FILE_NOT_EXIST,'文件不存在');
                end;
                rewrite(FTextFile);
        end;
        //当文件存在时,打开文件,当文件不存在时创建文件
        sofFileOpenCreate:begin
                rewrite(FTextFile);
        end;
        //打开文件准备添加数据,如果文件不存在,则报错
        sofFileAppendOnly:begin
                if not fexist then begin
                        raise ESafTextFileExcetpion.Create(FFileName,FOpenFileOption,
                                SAF_OPEN_FILE_RESULT_FILE_NOT_EXIST,'文件不存在');
                end;
                append(FTextFile);
        end;
        //当文件存在时,以追加的方式打开文件,当文件不存在时创建文件
        sofFileAppendCreate: begin
                if fexist then
                        append(FTextFile)
                else
                        rewrite(FTextFile);
        end;
        //当文件存在时,覆盖文件,当文件不存在时创建文件
        sofFileRewriteCreate:begin
                rewrite(FTextFile);
        end;
        end;
        FFileOpen := true;
end;

destructor TSafTextFile.Destroy;
begin
        if FFileOpen then CloseFile(FTextFile);
        inherited;
end;

function TSafTextFile.GetSeekEOF: boolean;
begin
        result := SeekEof(FTextFile);
end;

function TSafTextFile.GetSeekEOL: boolean;
begin
        result := SeekEoln(FTextFile);
end;

function TSafTextFile.Read: string;
begin
        System.Read(FTextFile,Result);
end;

function TSafTextFile.ReadLine: string;
begin
        System.Readln(FTextFile,Result);
end;

function TSafTextFile.MoveNextLines(nMvLines: integer): integer;
var
        i : integer;
begin
        Result := 0;
        for i:=1 to nMvLines do begin
                if self.EOF then exit;
                ReadLn(FTextFile);
                inc(Result);
        end;
end;

procedure TSafTextFile.Write(value:string);
begin
        System.Write(FTextFile,value);
end;

procedure TSafTextFile.WriteLine(value:string);
begin
        System.WriteLn(FTextFile,value);
end;

{ ESafTextFileExcetpion }

constructor ESafTextFileExcetpion.Create(fn: string; ofo: TSafOpenFileOpt;
  ec: integer; des: string);
begin
        FErrorCode:=ec;
        FDescribe:=des;
        FFileName:=fn;
        FOpenFileOption:=ofo;
        inherited Create(FDescribe);
end;

end.

 

简单的示例:

procedure .......
var 
      t : TSafTextFile;
begin
  try
         t := TSafTextFile.Create('c:/SafTextFile.txt',sofFileOpenCreate);
         try
                         t.DoSomeThing()
        finally
                         t.Free;
       end;
except
      on e:ESafTextFileException Do begin
                      ShowMessage(IntToStr(e.ErrorCode)+':'+e.Describe);
       end;
 end
end;