在非 Windows 平台上刷新文件缓冲区

Flush file buffers in on non-Windows platforms

我有一个日志记录组件,它使用 TByteStream 来存储日志内容,并使用 TFileStream 定期将它们写入磁盘。我需要确保在写入文件流后立即更新文件。到目前为止,我只知道 FlushFileBuffers(),这是一个 Windows 特定的函数。 XE8支持的其他平台如何实现?

RTL 没有在不关闭文件的情况下刷新文件的功能。您必须改用特定于平台的功能。在 Windows 上,TFileStream 使用 Win32 CreateFile() 函数 open/create 一个文件,因此您可以使用 FlushFileBuffers() 刷新它。在其他平台上,TFileStream使用POSIXopen()函数来open/create一个文件,所以可以使用POSIXfsync()函数刷新它.

试试这个:

uses
  ...
  {$IFDEF MSWINDOWS}
  , Winapi.Windows
  {$ELSE}
  , Posix.Unistd
  {$ENDIF}
  ;

...

{$IFDEF MSWINDOWS}
FlushFileBuffers(MyFileStream.Handle);
{$ELSE}
fsync(Integer(MyFileStream.Handle));
{$ENDIF}