inotify获取目录

时间:2013-01-08 13:22:25

标签: c++ directory inotify watch

我想监视某些目录中新文件的创建,并阅读有关inotify的链接。我喜欢这个实现并使用它。但是,在我的情况下,我想监视一个目录,该目录最多有3级子目录。

我的想法是每次创建一个新目录时添加一个监视,但为了做到这一点,我需要知道创建目录的路径。不幸的是,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);

这对于根目录是可以的,也可以看到level-1子目录,但是当我尝试将监视添加到level-2子目录时,路径不正确。

使用netbeans7.2,ubuntu12在c ++中编写。

1 个答案:

答案 0 :(得分:0)

我在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 );
                }
            }