如何通过系统API设置实时监控文件夹变动并发出预警?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1112个文字,预计阅读时间需要5分钟。
它不是轮询,而是内核级异步通知,延迟低、资源省。Windows原生方案中没比它更稳定的。但需配合重叠I/O和手动解析缓冲区,不能直接在回调函数中使用。
常见错误现象:ERROR_IO_PENDING 被当成失败处理;缓冲区太小导致事件丢失;没处理好“重命名后又新建同名文件”这类边界情况。
- 必须用
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED打开目录句柄 - 监控掩码选
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE覆盖多数预警场景 - 缓冲区建议 ≥ 8KB(
sizeof(FILE_NOTIFY_INFORMATION) * 128),小于 4KB 极易截断 - 每次读完要手动遍历
FILE_NOTIFY_INFORMATION链表,NextEntryOffset为 0 才算结束
Linux 下优先用 inotify,别碰 dnotify 或轮询
inotify 是目前最轻量、最通用的方案,glibc 封装少,基本就是裸调 inotify_init1、inotify_add_watch 和 read。注意它不递归,子目录要单独加 watch。
本文共计1112个文字,预计阅读时间需要5分钟。
它不是轮询,而是内核级异步通知,延迟低、资源省。Windows原生方案中没比它更稳定的。但需配合重叠I/O和手动解析缓冲区,不能直接在回调函数中使用。
常见错误现象:ERROR_IO_PENDING 被当成失败处理;缓冲区太小导致事件丢失;没处理好“重命名后又新建同名文件”这类边界情况。
- 必须用
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED打开目录句柄 - 监控掩码选
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE覆盖多数预警场景 - 缓冲区建议 ≥ 8KB(
sizeof(FILE_NOTIFY_INFORMATION) * 128),小于 4KB 极易截断 - 每次读完要手动遍历
FILE_NOTIFY_INFORMATION链表,NextEntryOffset为 0 才算结束
Linux 下优先用 inotify,别碰 dnotify 或轮询
inotify 是目前最轻量、最通用的方案,glibc 封装少,基本就是裸调 inotify_init1、inotify_add_watch 和 read。注意它不递归,子目录要单独加 watch。

