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 在文件句柄全关闭后才通知——如果某个程序正打开着被删的文件事件会延迟甚至丢失。 文小言 百度旗下新搜索智能助手有问题问小言。