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;