如何强制刷新文件

2024-02-04

假设我有以下代码:

#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(使用前将#替换为@)

如何强制刷新文件 的相关文章

随机推荐

  • 当Java类是Serialized的实例时

    我想知道Java类何时是Serialized的实例 据我所知 只有实现了 Serialized 接口的类才是可序列化的 我正在尝试使用 junit 生成实体类 从某种模板 并检查它是否可序列化 我生成的类 不实现可序列化 如下所示 pack
  • IKImageBrowserView可以显示多行标题吗?

    我想要我的IKImageBrowserView通过将其换行并将其显示在多行中来显示长标题 但我一直无法实现这一点 我尝试更改返回的 titleFrame 的大小ImageBrowserCell子类 并在标题上设置段落样式 以便它应该换行 N
  • Qt - 在我的 MainWindow 上调用 setLayout() 时编译器抱怨

    我想学习如何在没有设计师的情况下手工创建 GUI 我尝试添加一个布局到我的MainWindow但运行时它说 QWidget setLayout 尝试在主窗口 上设置 QLayout 该窗口已经有布局 这是我的代码 Header class
  • Node.js:何时使用 Promises 与 Callbacks

    我正在更新一些较旧的 Node js 代码 在此过程中 我正在设计新模块来使用旧代码 我发现现在 与我第一次写这篇文章时相比 我更多地依赖于使用 ES6 承诺而不是回调 所以现在我有一些返回承诺的函数和一些回调函数的组合 这是乏味的 我认为
  • 如何阻止 Electron windows 共享 cookie?

    我正在电子应用程序中创建多个浏览器窗口 但我不希望它们共享 cookie 这就是我目前创建窗口的方式 function createWindow Create the browser window let mainWindow new Br
  • 如何检查设备是否有互联网连接:cocos-2d

    在我的一款 iPhone 应用程序中 我需要查明该设备是否有互联网连接 有人请帮忙吗 使用可达性类 if self checkInternetConnected NSLog Internet connected n BOOL checkIn
  • 有没有办法恢复MySql用户密码?

    我忘记了 MySQL 中一位用户的密码 有没有办法恢复MySQL用户密码 你不能recover但是你可以设置一个不同的 though 像这样 使用 skip grant tables 选项停止和启动 MySQL 进程 登录root用户 列出
  • 为什么我在 DatePickerDialog 中收到额外的标头?

    我得到了 DatePickerDialog 的额外标头 如下面的快照所示 我不想要这个 我在这里做错了什么 我需要没有该标头的 DatePickerDialog 请查看代码并让我知道代码的哪一部分去了错误的 非常感谢您的帮助 我的活动 pu
  • Numpy的matrix_power函数对大指数给出错误的结果[重复]

    这个问题在这里已经有答案了 我正在使用 Numpy 来实现斐波那契数列Q 矩阵法 http mathworld wolfram com FibonacciQ Matrix html 直到 n 47 为止结果都很好 此时 matrix pow
  • Jenkins 文本查找器插件,如何将此插件与 jenkinsfile 一起使用?

    我正在尝试使用编写 jenkinsfile文本查找器插件 https wiki jenkins io display JENKINS Text finder Plugin 但我不知道它到底是如何工作的 这是我的代码 pipeline age
  • 如何在 Subversion 中删除文件夹的 1 个修订版

    我的存储库中有几个项目 每个项目都有自己的文件夹 是否可以删除其中一个项目的最后修订版而不更改其他任何内容 示例 项目 A 的最新版本已提交创建 rev 50 其他项目的工作仍在继续 存储库现已更新 60 现在 A 的用户回来并请求删除上一
  • HTML:替换

    我一直认为更换
  • Rails Activeadmin - 自定义关联选择框

    在我的 Rails 应用程序中 我有以下模型 class Idea lt ActiveRecord Base belongs to user end class User lt ActiveRecord Base has many idea
  • 如何从 ASP.Net OpenID Connect OWIN 组件设置声明?

    我对使用新的 ASP Net OpenID Connect 框架同时在身份验证管道中添加新声明有疑问 如下面的代码所示 我不确定幕后到底发生了多少 魔法 我认为我的大部分问题都围绕着对 OWIN 身份验证中间件而不是 OpenID Conn
  • 运行 React 应用程序时找不到模块“@babel/plugin-transform-react-jsx-source”

    我刚刚创建了一个 React 应用程序create react app aquastars然后使用弹出依赖项yarn run eject当我运行该应用程序时 出现以下错误 找不到模块 babel plugin transform react
  • VS2010 LNK1181 重建带有依赖项的项目时

    我有一个包含两个 C CLR 项目的解决方案 一个项目引用另一个项目 因此项目依赖项和构建顺序正确反映了这一点 两个项目都针对相同的输出文件夹 依赖项目的依赖配置为Copy Local false 如果我自己 重建 依赖关系 它会构建得很好
  • servlet 引擎在调用 servlet 之前是否读取整个请求?

    Servlet 引擎 例如Tomcat or Jetty 接收 HTTP 请求并使用 servlet 调用HttpServletRequest对象 其中包含一个InputStream请求正文的 现在我想知道引擎是否已经读取整体来自网络的请求
  • (AWS) Athena:查询结果似乎太短

    我的 Athena 查询的结果似乎太短 试图找出为什么 Setup 胶水目录 尺寸为 118 6 G 数据 以 CSV 和 JSON 格式存储在 S3 中 Athena Query 当我查询整个表的数据时 每次查询只得到 40K 条结果 一
  • 在 Netbeans GUI Builder 中开发现有 GUI 代码

    我正在 Eclipse 中做项目 我做了 Swing 部分 但现在 我希望使用 Netbeans 来完成项目的 Swing 部分 因为它更容易完成 而且我能够更整洁地完成它 因为我对 swing 及其布局管理器没有太多经验 这是我在 sta
  • 如何强制刷新文件

    假设我有以下代码 include