在非 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}
我有一个日志记录组件,它使用 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}