在 Linux 中,可以使用 inotify 机制来监控目录中的文件创建事件。下面是一个 C++ 示例,演示如何使用 inotify 监控目录中的文件创建事件。
1. 安装 inotify 相关的库
如果你的系统没有安装 inotify 相关的库,可以通过以下命令进行安装:
sudo apt-get install libinotify-dev
2. C++ 示例代码
以下是一个 C++ 程序,使用 inotify 来监控目录中是否有文件被创建:
#include <iostream>
#include <sys/inotify.h>
#include <unistd.h>
#include <cstring>#define BUF_LEN (10 * (sizeof(struct inotify_event) + NAME_MAX + 1))int main() {int fd, wd;char buffer[BUF_LEN];// 创建 inotify 实例fd = inotify_init();if (fd == -1) {std::cerr << "inotify_init failed: " << strerror(errno) << std::endl;return -1;}// 要监控的目录路径const char *path = "/path/to/monitor"; // 修改为你想要监控的目录路径// 监控文件创建事件 (IN_CREATE)wd = inotify_add_watch(fd, path, IN_CREATE);if (wd == -1) {std::cerr << "inotify_add_watch failed: " << strerror(errno) << std::endl;close(fd);return -1;}std::cout << "Monitoring directory: " << path << std::endl;while (true) {ssize_t len = read(fd, buffer, BUF_LEN);if (len == -1) {std::cerr << "read failed: " << strerror(errno) << std::endl;close(fd);return -1;}// 处理每个事件for (char *ptr = buffer; ptr < buffer + len; ptr += sizeof(struct inotify_event) + ((struct inotify_event *)ptr)->len) {struct inotify_event *event = (struct inotify_event *)ptr;if (event->mask & IN_CREATE) {std::cout << "File created: " << event->name << std::endl;}}}close(fd);return 0;
}
3. 代码说明
初始化 inotify 实例:
使用 inotify_init() 函数创建一个 inotify 实例。如果创建失败,程序会输出错误信息并退出。
fd = inotify_init();
添加监视:
使用 inotify_add_watch() 函数来监控指定目录的创建事件(IN_CREATE)。
wd = inotify_add_watch(fd, path, IN_CREATE);
这里的 IN_CREATE 是用来监控文件创建的事件,你也可以根据需要监听其他事件(例如 IN_DELETE、IN_MODIFY 等)。
事件处理:
程序通过 read() 函数读取 inotify 事件。当有文件在目录中创建时,程序会打印相关的文件名。
ssize_t len = read(fd, buffer, BUF_LEN);
缓冲区和事件解析:
缓冲区 buffer 中存储了事件信息,每次读取时都会根据事件的长度解析出每个事件。我们检查 IN_CREATE 标志,表示有文件被创建。
if (event->mask & IN_CREATE) {std::cout << "File created: " << event->name << std::endl;
}
清理:
在程序结束时关闭 inotify 文件描述符。
close(fd);
4. 编译并运行程序
编译并运行此程序:
g++ -o monitor_directory monitor_directory.cpp -lrt
./monitor_directory
确保将 “/path/to/monitor” 更改为你要监控的目录路径。
5. 解释事件
- IN_CREATE:文件或目录被创建。
- IN_MODIFY:文件内容被修改。
- IN_DELETE:文件或目录被删除。
6. 程序退出
按下 Ctrl + C 可停止程序的执行,退出监控。
总结
通过使用 inotify,你可以轻松地在 Linux 中使用 C++ 来监控目录是否有文件被创建。你可以根据需求进一步扩展监控的事件类型,并实现更复杂的逻辑。