Search code examples
delphidelphi-xe8

Flush file buffers in on non-Windows platforms


I have a logging component that uses a TByteStream for storing log contents and TFileStream for writing them to disk periodically. I need to ensure after writing to the file stream the file is updated immediately. So far I know only of FlushFileBuffers(), a Windows-specific function for that. How to do it on other supported by XE8 platforms?


Solution

  • The RTL has no function for flushing a file without closing it. You have to use platform-specific functions instead. On Windows, TFileStream uses the Win32 CreateFile() function to open/create a file, so you can use FlushFileBuffers() to flush it. On other platforms, TFileStream uses the POSIX open() function to open/create a file, so you can use the POSIX fsync() function to flush it.

    Try this:

    uses
      ...
      {$IFDEF MSWINDOWS}
      , Winapi.Windows
      {$ELSE}
      , Posix.Unistd
      {$ENDIF}
      ;
    
    ...
    
    {$IFDEF MSWINDOWS}
    FlushFileBuffers(MyFileStream.Handle);
    {$ELSE}
    fsync(Integer(MyFileStream.Handle));
    {$ENDIF}