假設我有以下代碼:如何強制文件刷新
#include <chrono>
#include <fstream>
#include <thread>
int main()
{
std::ofstream f("test.log");
int i = 0;
while (true)
{
f << i++;
f.flush();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
(請注意,我每次寫操作後flush
調用)
我注意到,這個應用程序不更新「 「test.log」文件的「最後修改時間」和「大小」屬性,除非我右鍵單擊該文件或打開它。
我想這是由於內部緩衝(系統不希望將這種耗時的操作作爲磁盤的實際I/O,除非被迫這樣做)。我對嗎?
我需要編寫一個應用程序,該應用程序應該監視由其他應用程序創建的日誌文件中的更改(我無法更改它們)。起初,我想到了C#中的FileSystemWatcher
類,但我注意到它具有相同的行爲(它不會觸發相應的事件,除非在源應用程序中關閉了文件,或者通過在Windows資源管理器中右鍵單擊該文件來強制更新)。那我該怎麼辦?爲我想要經常查找的每個文件調用WinAPI函數,如GetFileAttributes
?
我認爲你正在遭受標準窗口緩衝,尤其是在網絡驅動器上常見的問題。在那個它沒有立即注意到,你註定要等到Windows確認寫入磁盤 - 這也可能是由磁盤緩衝引起的,因爲儘管它沒有多大意義,因爲Windows緩衝了寫入,如果窗口還沒有實際承諾,其他部分沒有看到它 – BugFinder
@Jovasa那麼,Total Commander具有完全相同的行爲 – FrozenHeart
@BugFinder我看到了。但我有一個問題要解決。我需要找到一種正確的方法來強制這些由其他應用程序創建的「flush」 – FrozenHeart