我的代碼看起來接近該:競爭條件
- 大量使用普通的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怪癖。在關閉文件的所有句柄之前,目錄記錄中的屬性不反映實際的文件屬性。不僅僅是文件大小,還有時間戳值。 –