假设我有以下代码:
#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 等耗时的操作,除非被迫这样做)。我对吗?
我需要编写一个应用程序来监视其他应用程序创建的日志文件的更改(我无法更改它们)。起初,我想到FileSystemWatcher
我注意到它具有相同的行为(除非文件在源应用程序中关闭,或者通过在 Windows 资源管理器中右键单击该文件而强制更新),否则它不会触发相应的事件。那我能做什么呢?调用 WinAPI 函数,例如GetFileAttributes
对于我想要尽可能频繁查找的每个文件?
这里有两件事。一、文件MFT记录上的最后修改时间(相当于inode)is每次写信时都会更新。
然而返回的信息FindFirstFile
和朋友不是来自文件,而是来自目录条目中缓存的信息。每当文件关闭时都会更新此缓存通过该目录条目打开的。这是大多数应用程序显示的信息,例如 Windows 资源管理器和命令提示符 DIR 命令。
如果你想知道文件何时更新,你需要执行相当于 Unix 的操作stat
读取MFT记录(inode)的操作。这需要打开文件的句柄,调用GetFileInformationByHandle
并再次关闭手柄。
第二件事是有充分的理由不这样做。如果程序正在写入文件,则它可能正在写入过程中。因此,该文件可能处于无效(损坏)状态。为了确保文件处于有效状态,您应该等到文件关闭。这就是您知道该文件现在可以查看的方式。
一旦写入程序完成对文件的写入,目录条目将被更新,并且 FileSystemWatcher 将显示该文件。
如果您绝对确定想要查看仍在写入过程中的文件的通知,那么您可以选择查看 USN 更改日志。我不知道这是否比目录条目更新,您必须对此进行调查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)