如何强制文件刷新
How to force file flushing
假设我有以下代码:
#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"文件的"上次修改时间"answers"大小"属性,除非我右键单击这个文件或打开它
我想这是由于内部缓冲(系统不想进行像实际磁盘I/O这样耗时的操作,除非被迫这样做)。我说得对吗?
我需要编写一个应用程序来监视其他应用程序创建的日志文件中的更改(我无法更改它们)。起初,我想到了C#中的FileSystemWatcher
类,但我注意到它有同样的行为(除非文件在源应用程序中关闭,或者在Windows资源管理器中右键单击该文件,否则它不会触发相应的事件)。那我该怎么办?尽可能频繁地为我想要查找的每个文件调用像GetFileAttributes
这样的WinAPI函数?
这里有两个独立的东西。首先,文件MFT记录(相当于inode)上最后一次修改的时间在每次写入时都会更新。
然而,FindFirstFile
和好友返回的信息不是来自文件,而是来自目录项中缓存的信息。每当关闭通过该目录项打开的文件时,就会更新此缓存。这是大多数应用程序显示的信息,如Windows资源管理器和命令提示符DIR命令。
如果您想知道文件何时更新,您需要执行相当于Unix stat
操作的操作,该操作读取MFT记录(inode)。这需要打开文件的句柄,调用GetFileInformationByHandle
并再次关闭句柄。
第二件事是有充分的理由不这样做。如果一个程序正在写入一个文件,它可能已经完成了写入过程的一半。因此,文件可能处于无效(损坏)状态。若要确保文件处于有效状态,您应该等待文件关闭。这就是你知道文件现在可以查看的方式。
一旦写入程序完成了对文件的写入,目录条目将被更新,FileSystemWatcher将显示该文件。
如果您绝对确定要查看仍在写入过程中的文件的通知,那么您可以查看USN更改日志作为一个选项。我不知道这是否比目录条目更及时,你必须对此进行调查。
- 如何在 Windows 中立即刷新文件夹图标
- 如何使用 Boost 的"mapped_file_sink"类刷新内存映射文件?
- 如何用刷新内容替换现有文件到资产文件夹中
- 刷新属性在简单文件通道中的工作原理
- 如何确保数据刷新到文件 IO (WriteFile()) 上的 HDD(未缓冲)
- 由触发器调用的 MS SQL XP 更改 C++ 文件日期戳,以允许刷新表单应用程序 vb.net
- 在监视器超时之前将文件刷新到磁盘
- 刷新不调用文件更改
- 如何为刷新ROM创建C++可执行文件
- 提升记录器刷新到文件
- 获取文件数据后刷新 cout 的问题
- 如何在使用FFmpeg写入mp4文件时将缓冲区数据刷新到磁盘
- 使用c++的流将文件写入或刷新到异步NFS
- QFileSystemWatcher:检测文件是否已刷新
- 可能在刷新操作中写入文件失败
- 具有桌面.ini和即时刷新功能的自定义文件夹图标
- 如何在win32上刷新stdlib输出文件?
- 头文件刷新/更新
- 头文件未刷新- Visual c++ 2012
- 仅刷新文件元数据