Delphi的文本文件操作類源碼

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;

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章