【发布时间】:2012-06-24 17:04:48
【问题描述】:
我的代码看起来接近这个:
- 大量写入使用普通 C++ IO 流插入,例如
steram << "foo"; -
stream.flush();在某个时候; - MSVC C API 的
_stat()在上述刷新之后立即调用。
我观察到的是_stat() 调用返回的尺寸与stream.tellp() 不同,尺寸更小。
如果我在调用_stat() 函数之前关闭stream,它会返回正确的结果。我已经进入_stat(),它使用FindFirstFileEx() 来获取大小。
这是一个已知的 Win32 API 怪癖吗?
【问题讨论】:
-
stream.flush() 是否有可能是异步的,在缓冲区刷新之前返回?
-
您应该通过 FileMon 检查您的调用执行哪些操作。如果他们不小心使用了 FASTIO_WRITE 而不是 IRP_MJ_WRITE,那么您的代码会隐式使用 FASTIO 的中间缓冲区。也许您可以通过编程方式强制回退到 IRP,但这会减慢编写过程。
-
这是为 NTFS 文件系统设计的,而不是 api 怪癖。在关闭文件的所有句柄之前,目录记录中的属性不会反映实际的文件属性。不仅仅是文件大小,还有时间戳值。
-
@HansPassant:如果我使用
GetFileAttributesEx()而不是_stat(),我会得到更准确的信息吗?
标签: c++ winapi visual-c++ iostream