首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inotify获取目录

inotify获取目录
EN

Stack Overflow用户
提问于 2013-01-08 21:22:25
回答 1查看 1.9K关注 0票数 1

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

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

代码语言:javascript
复制
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是:

代码语言:javascript
复制
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++。

EN

回答 1

Stack Overflow用户

发布于 2013-07-17 09:31:06

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

代码语言:javascript
复制
            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 );
                }
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14215912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档