1

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

4

1 回答 1

2

RTL 没有在不关闭文件的情况下刷新文件的功能。您必须改用特定于平台的功能。在 Windows 上,TFileStream使用 Win32CreateFile()函数打开/创建文件,因此您可以使用FlushFileBuffers()它来刷新它。在其他平台上,TFileStream使用 POSIXopen()函数打开/创建文件,因此您可以使用 POSIXfsync()函数刷新它。

尝试这个:

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

...

{$IFDEF MSWINDOWS}
FlushFileBuffers(MyFileStream.Handle);
{$ELSE}
fsync(Integer(MyFileStream.Handle));
{$ENDIF}
于 2015-06-05T18:56:22.810 回答