2013-01-08 42 views
1

我想监视某些目录中新文件的创建并阅读关于inotify的链接。我喜欢这个实现并使用它。但是,就我而言,我想监视一个有3级子目录的目录。inotify获取目录

我的想法是在每次创建新目录时添加一个监视,但为了执行此操作,我需要知道创建的目录的路径。不幸的是,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级子目录获取也看了,但是当我尝试手表添加到Level-2子目录路径不正确。

用C++编写的netbeans7.2,ubuntu12。

+0

http://stackoverflow.com/questions/9313206/retrieve-the-full-path-name-from-inotify-event – us2012

+0

的可能重复不是真的,因为这个问题重复是指监测新的子目录,而另一个只关心确定文件的名称(带路径)。 –

回答

0

我有一个工作示例Github支持inotify目录创建/删除事件。 小型Watch类负责将wd(观察描述符)映射到文件/文件夹名称。 这是一段代码,展示了如何处理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); 
       } 
      }