我的代码看起来接近该:竞争条件
- 大量使用普通的C++ IO流插入的写操作的像
steram << "foo";
stream.flush();
在一些点;- MSVC C API的
_stat()
在上面刷新后调用。
我所观察到的是,_stat()
调用返回的大小从stream.tellp()
不同,尺寸较小。
如果我在调用_stat()
函数之前关闭stream
,它会返回正确的结果。我已经步入_stat()
,它使用FindFirstFileEx()
来获得大小。
这是一个已知的Win32 API quirk吗?
是否有可能stream.flush()是异步的,并在缓冲区刷新之前返回? –
您应该通过FileMon检查,哪些操作是由您的呼叫执行的。如果偶然使用FASTIO_WRITE而不是IRP_MJ_WRITE,那么您的代码将隐式使用FASTIO的中间缓冲区。也许你可以通过编程实现对IRP的回退,但这会减慢写入过程。 – Stan
这是为NTFS文件系统而设计的,而不是api怪癖。在关闭文件的所有句柄之前,目录记录中的属性不反映实际的文件属性。不仅仅是文件大小,还有时间戳值。 –