gpt4 book ai didi

c++ - inotify 获取目录

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:09 34 4
gpt4 key购买 nike

我想监控某些目录中新文件的创建并阅读有关 inotify 的链接.我喜欢这个实现并使用了它。然而,在我的例子中,我想监控一个最多有 3 级子目录的目录。

我的想法是每次创建一个新目录时添加一个 watch ,但为了做到这一点,我需要知道创建目录的路径。不幸的是,inotify 的事件结构只能给我创建的文件目录的名称,而不是它的路径。谁能为此提出一个想法?

add_watch(fd,root);
if ( event->mask & IN_CREATE) {
if (event->mask & IN_ISDIR){
printf("%d DIR::%s CREATED\n", event->wd,event->name );
strcpy(new_dir,root);
strcat(new_dir,"/");
strcat(new_dir,event->name);
add_watch(fd,new_dir);

add_watch 在哪里:

void add_watch(int fd, char *root)
{
int wd;
struct dirent *entry;
DIR *dp;

dp = opendir(root);
if (dp == NULL)
{
perror("Error opening the starting directory");
exit(0);
}

/* add watch to starting directory */
wd = inotify_add_watch(fd, root, IN_CREATE | IN_MODIFY | IN_MOVED_TO);

这对根目录没问题,1 级子目录也被监视,但是当我尝试向 2 级子目录添加监视时,路径不正确。

使用netbeans7.2、ubuntu12用c++编写。

最佳答案

我在 Github 上有一个工作样本支持 inotify 目录创建/删除事件。一个小的 Watch 类负责将 wd(监视描述符)映射到文件/文件夹名称。这是一个片段,展示了如何处理 inotify CREATE 和 DELETE 事件。完整样本在 Github 上.

            if ( event->mask & IN_CREATE ) {
current_dir = watch.get(event->wd);
if ( event->mask & IN_ISDIR ) {
new_dir = current_dir + "/" + event->name;
wd = inotify_add_watch( fd, new_dir.c_str(), WATCH_FLAGS );
watch.insert( event->wd, event->name, wd );
total_dir_events++;
printf( "New directory %s created.\n", new_dir.c_str() );
} else {
total_file_events++;
printf( "New file %s/%s created.\n", current_dir.c_str(), event->name );
}
} else if ( event->mask & IN_DELETE ) {
if ( event->mask & IN_ISDIR ) {
new_dir = watch.erase( event->wd, event->name, &wd );
inotify_rm_watch( fd, wd );
total_dir_events--;
printf( "Directory %s deleted.\n", new_dir.c_str() );
} else {
current_dir = watch.get(event->wd);
total_file_events--;
printf( "File %s/%s deleted.\n", current_dir.c_str(), event->name );
}
}

关于c++ - inotify 获取目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215912/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com