1

我想监视某些目录中新文件的创建并阅读有关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);

这对于根目录来说没问题,一级子目录也被监视,但是当我尝试向二级子目录添加监视器时,路径不正确。

用netbeans7.2,ubuntu12用c ++编写。

4

1 回答 1

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 );
                }
            }
于 2013-07-17T01:31:06.100 回答