Delphi 10.3中如何检测文本文件是通过Rewrite还是Append打开?
在Delphi 10.3中检测文本文件是通过Rewrite还是Append打开的方法
Delphi的标准TextFile类型并没有提供原生API直接检测文件是通过Rewrite还是Append打开的——这两个方法本质都是以写入模式打开文件,区别仅在于初始指针位置(Rewrite将指针置于文件开头并清空原有内容;Append将指针置于文件末尾并保留原有内容),而RTL没有把这个打开模式的信息暴露给开发者。
下面是两种可行的替代方案:
方案一:封装文件操作类(推荐)
通过自定义类封装文本文件的打开与操作,将打开模式和文件对象绑定,避免全局变量带来的污染和维护问题。示例代码如下:
type TTextFileOpenMode = (tfomRewrite, tfomAppend); TTextFileWrapper = class private FFile: TextFile; FOpenMode: TTextFileOpenMode; public constructor Create(const AFileName: string; AOpenMode: TTextFileOpenMode); destructor Destroy; override; procedure WriteLn(const S: string); overload; procedure WriteLn; overload; property OpenMode: TTextFileOpenMode read FOpenMode; end; constructor TTextFileWrapper.Create(const AFileName: string; AOpenMode: TTextFileOpenMode); begin inherited Create; FOpenMode := AOpenMode; case AOpenMode of tfomRewrite: Rewrite(FFile, AFileName); tfomAppend: Append(FFile, AFileName); end; end; destructor TTextFileWrapper.Destroy; begin CloseFile(FFile); inherited; end; procedure TTextFileWrapper.WriteLn(const S: string); begin System.WriteLn(FFile, S); end; procedure TTextFileWrapper.WriteLn; begin System.WriteLn(FFile); end;
使用时,创建实例并指定打开模式,之后可随时通过OpenMode属性获取打开方式:
var FileWrapper: TTextFileWrapper; begin FileWrapper := TTextFileWrapper.Create('test.txt', tfomAppend); try if FileWrapper.OpenMode = tfomAppend then ShowMessage('文件以Append模式打开'); FileWrapper.WriteLn('新增内容'); finally FileWrapper.Free; end; end;
方案二:通过文件指针位置判断(有局限性)
利用Append打开时指针位于文件末尾、Rewrite打开时指针位于文件开头的特性,通过FilePos和FileSize函数对比判断。但这个方法仅在刚打开文件且未移动指针、未写入内容时有效,一旦指针位置被改变,判断结果就会失效。示例代码:
function IsFileOpenedWithAppend(const AFile: TextFile): Boolean; var FileSizeVal, CurrentPos: Integer; begin FileSizeVal := FileSize(AFile); CurrentPos := FilePos(AFile); Result := (CurrentPos = FileSizeVal); end;
内容的提问来源于stack exchange,提问作者Jean-Philippe
相关产品推荐
相关产品推荐

