2013-01-08 55 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); 
       } 
      }