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:ForRewrite(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
。除了方便之外,这也避免了竞争条件。