0

0

C++如何实现文件监控?(inotify与ReadDirectoryChangesW封装)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-24 13:15:24

|

234人浏览过

|

来源于php中文网

原创

linux用inotify监控需结合epoll/select避免轮询,正确解析多事件及cookie配对;windows需异步iocp,注意路径格式与缓冲区;跨平台应暴露底层事件而非强行统一语义。

c++如何实现文件监控?(inotify与readdirectorychangesw封装)

Linux下用inotify监控文件变化,别直接裸写循环

inotify本身不阻塞,但read()返回的事件需要自己解析,裸写while循环容易漏事件或卡死。核心是把inotify_fd放进epoll或select里等就绪,而不是反复read()轮询。

  • 每次read()可能返回多个struct inotify_event,要按event->len偏移累加解析,不能只取第一个
  • IN_MOVED_FROMIN_MOVED_TO必须配对看cookie字段,否则重命名会被当成删除+新建
  • 监控目录时,子目录里的文件变动不会自动上报,得递归调用inotify_add_watch(),且注意IN_CREATE | IN_ISDIR捕获新目录后立刻加监
  • 内核inotify实例有上限(/proc/sys/fs/inotify/max_user_watches),大项目建议按需增配,别一上来就全目录递归

Windows上ReadDirectoryChangesW必须配合Overlapped I/O

同步模式下ReadDirectoryChangesW()会阻塞线程,且单次调用只返回一批事件,不设超时就永远卡住。真实项目必须用异步I/O + GetQueuedCompletionStatus()或IOCP。

  • 缓冲区至少4KB,太小会导致ERROR_NOTIFY_ENUM_DIR错误,事件被截断
  • lpOverlapped必须指向堆内存(栈变量在函数返回后失效),且每个监控需独立OVERLAPPED结构
  • 监控路径要用\?C:path格式绕过MAX_PATH限制,普通C:开头路径在深层嵌套时会失败
  • 返回的FILE_NOTIFY_INFORMATION是变长结构,遍历要用NextEntryOffset跳转,不是简单指针++

跨平台封装的关键不是抽象API,而是统一事件语义

inotify的IN_DELETE_SELF和Windows的FILE_ACTION_REMOVED对“监控目录被删”的处理逻辑完全不同:前者watch自动失效,后者仍能收到后续事件直到句柄关闭。强行统一成“目录消失”会掩盖行为差异。

Scribble Diffusion
Scribble Diffusion

使用AI将你的草图变成精致的图像

下载
  • 优先暴露底层事件类型(如IN_MOVED_TOFILE_ACTION_ADDED),再由上层业务决定是否合并
  • 路径字段在Windows返回的是相对路径(相对于监控句柄),inotify是相对于watch添加时的路径,拼接完整路径时逻辑不同
  • inotify没有“文件被其他进程修改”的精确通知(IN_MODIFY粒度是写操作,非内容变更),Windows的FILE_ACTION_MODIFIED也仅表示属性/时间戳改,二者都不能替代文件内容校验

不要用std::filesystem::last_write_time轮询做“轻量替代”

看似简单,但每秒扫一次目录,1000个文件就是1000次系统调用,CPU和IO开销远超inotify/IOCP。更糟的是,两次轮询之间发生的快速创建-删除-重建,会彻底丢失事件。

立即学习C++免费学习笔记(深入)”;

  • 轮询间隔设成100ms也没用——last_write_time()精度在Windows是100ns但实际更新延迟常达15ms,Linux ext4默认是秒级
  • 如果真要兜底,只对单个关键文件用stat()/GetFileAttributesEx()检查mtime,别扫目录树
  • 某些容器环境(如Docker Desktop for Mac)挂载卷不支持inotify,此时轮询是唯一选择,但必须明确标注为降级模式

真正的难点从来不是调哪个函数,而是怎么让事件流不丢、不错、不重复,以及当监控路径被mv/rm/rename时,你的回调是否还持有有效句柄或路径引用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.25

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6479

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

365

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

437

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6479

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

365

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

437

2024.02.23

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

2

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号