Some time ago, I wrote on the hard drives that lie about flushing file buffers (and the drivers who love them). Here's a check-in on what's happened over the past few years.
As things stand today,
you can rely on
FlushFileBuffers
committing your changes to physical disk.
(Noting of course that
this operation is expensive
and may not actually help you
if you aren't updating your data transactionally.)
Historically,
NTFS used the
Force Unit Access flag
to indicate to the driver that it should wait
until the information is committed to non-volatile storage
before signaling that the operation has completed.
The conventional technique to force writes to
go to media is to pass
FILE_
,
which internally tells the file system to set the
FUA flag on I/O operations to that file.
But as noted in
this article,
in the Windows 7 time frame,
EIDE and SATA drivers do not respect the FUA flag,
which means that your writes may still be buffered
by the drive's internal memory.
Fortunately,
even with those drivers,
the FlushFileBuffers
function will send the
FLUSH_
command,
which tells the drive,
"Hey, I know you have internal buffers.
Look at me when I'm talking to you.
Yes, you.
With the internal buffers.
Go flush them."
Fortunately, nearly all drivers in the Windows 7 era
respect that command.
(There are a few stragglers that still ignore it.)
Fast-forward to Windows 8.
Support for
FLUSH_
is required
by all drives in order to be declared
compatible with Windows 8,
and
the Windows storage team has worked with hard drive
vendors to ensure that
FLUSH_
is properly respected.
NTFS switched from using the FUA flag
to
the FLUSH_
command
to enforce
consistency of its metadata.
Note that if an application opens a file with the
FILE_
flag,
NTFS still sets the FUA flag on the write operations.
But as noted above,
EIDE and SATA drivers do not respect the FUA flag,
so asking for
FILE_
doesn't give you any additional robustness
in those cases.
If you want to flush the data to physical media,
the FlushFileBuffers
function
is your ticket.
As noted in the linked article, there are options in the UI to disable the signal to flush intermediate buffers, but you should use them only if you have a separate UPS for the hard drive, or if you simply don't mind that the drive can get corrupted in the event of a power failure.