c++如何监控指定文件夹内文件的新增与删除事件记录【实战】

最轻量方案是Linux用inotify(内核原生,无需第三方库)、Windows用ReadDirectoryChangesW(避免轮询);需注意事件覆盖(如IN_MOVED_TO)、绝对路径、缓冲区大小、跨平台语义差异及调试验证。Linux 下用 inotify 监控文件夹增删事件最轻量inotify 是内核原生支持的机制,不依赖第三方库,inotify_init() + inotify_add_watch() 就能监听 IN_CREATE 和 IN_DELETE 两类事件。glibc 已封装好,C++ 直接 #include <sys/inotify.h> 即可,不用引入 Boost 或 Qt。常见错误是只监听 IN_CREATE 却漏掉 IN_MOVED_TO:很多编辑器(如 VS Code、vim)保存文件时用的是"写临时文件 + rename"方式,触发的是移动事件而非创建事件。必须同时监听 IN_CREATE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM 才能覆盖真实场景inotify_add_watch() 的第二个参数是路径,不能是相对路径(会静默失败),必须用 realpath() 转成绝对路径单次 read() 可能返回多个事件,需循环解析 struct inotify_event,不能假设一次只一个事件缓冲区大小默认很小(8192 字节),高频操作下容易丢事件;建议 malloc(64 * 1024) 并检查 read() 返回值是否为 -1 且 errno == EAGAINWindows 上用 ReadDirectoryChangesW 避免轮询开销Windows 没有 inotify 对等物,ReadDirectoryChangesW() 是唯一靠谱的异步通知方案。它需要 HANDLE、重叠 I/O 和单独线程处理完成包,比 Linux 复杂,但比每秒 FindFirstFile 轮询强十倍。典型坑是把 FILE_NOTIFY_CHANGE_FILE_NAME 和 FILE_NOTIFY_CHANGE_DIR_NAME 混用:前者只报文件名变化(新建/删除文件),后者才报子目录变动(新建/删除子目录)。监控文件夹内容,两个标志要 | 运算一起传。立即学习"C++免费学习笔记(深入)";回调函数里拿到的 FILE_NOTIFY_INFORMATION 是变长结构,NextEntryOffset 为 0 表示末尾,不能硬写 for 循环次数必须用 GetOverlappedResult() 或 IOCP 获取结果,直接 WaitForSingleObject() 容易假死路径是宽字符,FileNameLength 单位是字节而非字符数,转 std::string 前得先用 WideCharToMultiByte()该 API 不递归监听子目录,要监控整个树,得对每个子目录单独调用 CreateFile() + ReadDirectoryChangesW()跨平台封装要注意事件语义差异Linux inotify 和 Windows ReadDirectoryChangesW 对"删除"的定义不同:inotify 在 unlink() 后立刻发 IN_DELETE,而 Windows 在文件句柄全关闭后才通知------如果某个程序正打开着被删的文件,事件会延迟甚至丢失。 文小言 百度旗下新搜索智能助手,有问题,问小言。

相关推荐
未知违规用户3 分钟前
大模型项目: 学习FastAPI 服务器开发
服务器·人工智能·python·学习·fastapi
想会飞的蒲公英6 分钟前
PyTorch reshape、view、transpose、广播到底怎么选?
人工智能·pytorch·python
卷无止境7 分钟前
Python装饰器:一层糖衣包裹的函数魔法
后端·python
xlrqx9 分钟前
长治家电清洗培训基地如何挑选及行业基本培训标准科普
大数据·python
无敌秋13 分钟前
python/c++/java上云
java·c++·python
卷无止境16 分钟前
Python的Lambda表达式——不起名字的函数也能干大事
后端·python
映翰通朱工19 分钟前
从0到1:EC942边缘计算机用Python实现Modbus TCP采集+MQTT上云全记录(附踩坑实录)
网络·python·网络协议·tcp/ip·二次开发·映翰通
donoot22 分钟前
双层 PDF 体积暴涨(18MB 原图 → 200MB PDF)完整原因剖析 + 针对性优化方案
python·pymupdf·paddleocr·双层pdf
数智化管理手记2 小时前
手工统计指标误差大、效率低?指标管理系统如何告别人工算数痛点?
大数据·运维·数据库·人工智能·云计算
ShiXZ2138 小时前
Redis 常用指令全集:redis-cli 实战速查手册
数据库·redis·缓存