私はそれがあると仮定します。TFileStreamはpascal IO Append(F)と同等ですか?
FS := TFileStream.Create(FileName, fmOpenReadWrite);
FS.Seek(0, soFromEnd);
は正しいことですか?開いているモードが正しいか、おそらくfmOpenWrite
か、またはfmShareDenyNone
を追加する必要がありますか?
PS:Rewrite(F)
のために、私は実際にそれはあなたが見ることができる
FStream := TFileStream.Create(Filename, fmOpenWrite);
FStream.Seek(0, soEnd);
だろう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;
でそれらのそれぞれの定義を見つけることができますあなたは読みたい、なぜ読み取り/書き込みを使用していませんか?かわいくするには、 'THandleStream'を使って' CreateFile'と 'FILE_APPEND_DATA'フラグのハンドルを渡して、いつも追加するようにしてください。 –
あなた自身で 'CreateFile'を呼び出すと、' OPEN_ALWAYS'作成処理を使用できるようになり、ファイルが存在するかどうかについて競合条件が発生しないようにします。 –