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

Delphi 在非Windows平台上刷新文件缓冲区,delphi,delphi-xe8,Delphi,Delphi Xe8,我有一个日志组件,它使用TByteStream存储日志内容,使用TFileStream定期将它们写入磁盘。我需要确保写入文件流后,文件立即更新。到目前为止,我只知道FlushFileBuffers(),这是一个Windows特有的函数。如何在XE8平台支持的其他平台上执行此操作?RTL没有在不关闭文件的情况下刷新文件的功能。您必须使用特定于平台的功能。在Windows上,TFileStream使用Win32CreateFile()函数打开/创建文件,因此可以使用FlushFileBuffers(

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

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

试试这个:

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

...

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

你需要针对每个目标平台的特定平台。我明白了,也许我的措辞让人困惑,我只是不知道必要的功能。我们不知道平台。一次做一个可能更好。我希望XE8平台当前支持的所有项目都能使用它。我想你可以尝试关闭文件流。我相信这会迫使缓冲区中的数据直接写入硬盘。如果这是可行的,那么检查在关闭文件流时调用了什么代码并在您自己的特殊方法中复制它可能不是一个坏主意。