通知get目录

inotify get directory

本文关键字:目录 get 通知      更新时间:2023-10-16

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

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

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

where add_watch is:

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);

这对于根目录来说是可以的,一级子目录也会被监视,但是当我试图向二级子目录添加监视时,路径不正确。

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

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