Serge Rogatch
Serge Rogatch

Reputation: 15020

How to flush all file buffers in Windows?

There is FlushFileBuffers() API in Windows to flush buffers till hard drive for a single file. There is sync() API in Linux to flush file buffers for all files.

However, is there WinAPI for flushing all files too, i.e. a sync() analog?

Upvotes: 5

Views: 5516

Answers (2)

Michael Chourdakis
Michael Chourdakis

Reputation: 11158

https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-flushfilebuffers

It is possible to flush the entire hard drive.

To flush all open files on a volume, call FlushFileBuffers with a handle to the volume. The caller must have administrative privileges. For more information, see Running with Special Privileges.

Also, the same article states the correct procedure to follow if, for some reason, data must be flushed: CreateFile function with the FILE_FLAG_NO_BUFFERING and FILE_FLAG_WRITE_THROUGH flags.

Due to disk caching interactions within the system, the FlushFileBuffers function can be inefficient when used after every write to a disk drive device when many writes are being performed separately. If an application is performing multiple writes to disk and also needs to ensure critical data is written to persistent media, the application should use unbuffered I/O instead of frequently calling FlushFileBuffers. To open a file for unbuffered I/O, call the CreateFile function with the FILE_FLAG_NO_BUFFERING and FILE_FLAG_WRITE_THROUGH flags. This prevents the file contents from being cached and flushes the metadata to disk with each write. For more information, see CreateFile.

But also check the restrictions of file buffering about memory and data alignment.

Upvotes: 4

Mirjalal
Mirjalal

Reputation: 1352

According to File Management Functions there is no any sync() analog from Linux in WinAPI.

Upvotes: 1

Related Questions