Delphi TFileStream与pascal IO Append(F)的等价物是什么?

Delphi TFileStream与pascal IO Append(F)的等价物是什么?,delphi,Delphi,我想是这样的: FS := TFileStream.Create(FileName, fmOpenReadWrite); FS.Seek(0, soFromEnd); 对吗?打开模式是否正确,或者可能是fmOpenWrite或需要添加fmsharedynone PS:ForRewrite(F)I使用了FS:=TFileStream.Create(文件名,fmCreate) 根据@David的评论,我最终使用了THandleStream procedure LOG(const FileNam

我想是这样的:

FS := TFileStream.Create(FileName, fmOpenReadWrite);
FS.Seek(0, soFromEnd); 
对吗?打开模式是否正确,或者可能是
fmOpenWrite
或需要添加
fmsharedynone

PS:For
Rewrite(F)
I使用了
FS:=TFileStream.Create(文件名,fmCreate)


根据@David的评论,我最终使用了
THandleStream

procedure LOG(const FileName: string; S: string);
const
  FILE_APPEND_DATA = 4;
  OPEN_ALWAYS = 4;
var
  Handle: THandle;
  Stream: THandleStream;
begin
  Handle := CreateFile(PChar(FileName),
    FILE_APPEND_DATA, // Append data to the end of file
    0, nil,
    OPEN_ALWAYS, // If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
                 // If the specified file does not exist and is a valid path to a writable location, the function creates a file and the last-error code is set to zero.
    FILE_ATTRIBUTE_NORMAL, 0);

  if Handle <> INVALID_HANDLE_VALUE then
  try
    Stream := THandleStream.Create(Handle);
    try
      S := S + #13#10;
      Stream.WriteBuffer(S[1], Length(S) * SizeOf(Char));
    finally
      Stream.Free;
    end;
  finally
    FileClose(Handle);
  end
  else
    RaiseLastOSError;
end;
过程日志(常量文件名:string;S:string);
常数
文件\附加\数据=4;
打开_始终=4;
变量
手柄:坦德尔;
溪流:坦德尔溪流;
开始
句柄:=创建文件(PChar(文件名),
FILE\u APPEND\u DATA,//将数据追加到文件末尾
零,零,,
OPEN_ALWAYS,//如果指定的文件存在,则函数成功,最后一个错误代码设置为error_ready_exists(183)。
//如果指定的文件不存在并且是指向可写位置的有效路径,则函数将创建一个文件,最后一个错误代码将设置为零。
文件\属性\正常,0);
如果句柄无效\u句柄\u值,则
尝试
Stream:=THandleStream.Create(句柄);
尝试
S:=S+#13#10;
Stream.WriteBuffer(S[1],长度*SizeOf(Char));
最后
免费;
结束;
最后
文件关闭(句柄);
结束
其他的
赖斯·塞罗;
结束;
实际上是这样的

FStream := TFileStream.Create(Filename, fmOpenWrite);
FStream.Seek(0, soEnd);
您可以在
TBinaryWriter.Create
TStreamWriter.Create
中看到一个示例,或者您可以选择直接使用其中一个类。

实际上是这样的

FStream := TFileStream.Create(Filename, fmOpenWrite);
FStream.Seek(0, soEnd);
您可以在
TBinaryWriter.Create
TStreamWriter.Create
中看到一个示例,或者您可以选择直接使用这些类中的一个

var
  FileName: string;
  FS: TFileStream;
  sOut: string;
  i: Integer;
  Flags: Word;
begin
  FileName := ...; // get your file name from somewhere
  Flags := fmOpenReadWrite;
  if not FileExists(FileName) then
    Flags := Flags or fmCreate;
  FS := TFileStream.Create(FileName, Flags);
  try
    FS.Position := FS.Size;  // Will be 0 if file created, end of text if not
    sOut := 'This is test line %d'#13#10;
    for i := 1 to 10 do
    begin
      sOut := Format(sOut, [i]);
      FS.Write(sOut[1], Length(sOut) * SizeOf(Char)); 
    end;

  finally
    FS.Free;
  end;
end;
此代码还验证文件是否不存在,如果不存在,则创建文件

关于标志,您可以在

中找到每个标志的定义,应该是这样的

var
  FileName: string;
  FS: TFileStream;
  sOut: string;
  i: Integer;
  Flags: Word;
begin
  FileName := ...; // get your file name from somewhere
  Flags := fmOpenReadWrite;
  if not FileExists(FileName) then
    Flags := Flags or fmCreate;
  FS := TFileStream.Create(FileName, Flags);
  try
    FS.Position := FS.Size;  // Will be 0 if file created, end of text if not
    sOut := 'This is test line %d'#13#10;
    for i := 1 to 10 do
    begin
      sOut := Format(sOut, [i]);
      FS.Write(sOut[1], Length(sOut) * SizeOf(Char)); 
    end;

  finally
    FS.Free;
  end;
end;
此代码还验证文件是否不存在,如果不存在,则创建文件


关于标志,您可以在不想读取的

中找到它们的定义,那么为什么要使用读/写呢?如果你想变得可爱,你可以使用
THandleStream
CreateFile
传递一个句柄和
FILE\u APPEND\u DATA
标志来确保你总是追加。自己调用
CreateFile
允许你使用
OPEN\u always
创建配置,从而避免在文件是否存在。您不想读取,为什么要使用读/写?如果你想变得可爱,你可以使用
THandleStream
CreateFile
传递一个句柄和
FILE\u APPEND\u DATA
标志来确保你总是追加。自己调用
CreateFile
允许你使用
OPEN\u always
创建配置,从而避免在文件是否存在。未声明的标识符:“soEnd”是soFromEnd:)-取决于Delphi版本。在柏林,我们有
TsekeOrigin=(soBeginning,soCurrent,soEnd)由于您没有指定任何版本,我通常采用当前版本。@MartynA,我在Delphi 5上,没有
TSeekOrigin
soFromEnd
声明为
soFromEnd=2
。即使是文件也有误导性。看看RBA链接。它说:“
soFromEnd
是TSeekOrigin值之一…”文档显示
TsekOrigin=(soBeginning,soCurrent,soEnd)。我以为我们打字打错了,请别再给我讲了。@RBA,事实上文档是错的
soFromEnd
不是未声明标识符的一部分:“soEnd”是soFromEnd:)-取决于Delphi版本。在柏林,我们有
TsekeOrigin=(soBeginning,soCurrent,soEnd)由于您没有指定任何版本,我通常采用当前版本。@MartynA,我在Delphi 5上,没有
TSeekOrigin
soFromEnd
声明为
soFromEnd=2
。即使是文件也有误导性。看看RBA链接。它说:“
soFromEnd
是TSeekOrigin值之一…”文档显示
TsekOrigin=(soBeginning,soCurrent,soEnd)。我以为我们打字打错了,请别再给我讲了。@RBA,事实上文档是错的
soFromEnd
不属于
TSeekOrigin
这是
TFileStream
的一大弱点。无法访问“始终打开”
创建配置。执行此操作的我的代码调用
CreateFile
,然后使用
THandleStream
。除了方便之外,这还避免了竞争条件。这是
TFileStream
的一大弱点。无法访问“始终打开”
创建配置。执行此操作的我的代码调用
CreateFile
,然后使用
THandleStream
。除了方便之外,这也避免了竞争条件。