2012-01-30 2 views
9

У меня есть папка под названием «Datas». Эта папка имеет подпапку под названием «Входящие», внутри которой есть несколько файлов «.txt». Эта папка «Datas» может быть изменена, и в конце будет множество подпапок с подпапками «Входящие» и «.txt». Мне нужно отслеживать папку «Datas» и «.txt» из папки «Входящие». Как я могу это сделать?Как контролировать папку со всеми подпапками и файлами внутри?

INotify только отслеживает папку и создает события, когда создаются подпапки. Как вызывать события при создании файлов «.txt» (в какой папке)?

Мне нужен код C или C++, но я застрял. Я не знаю, как это решить.

+3

какая операционная система? –

+2

@VJovic inotify - это конкретный Linux. –

+1

@AbhijeetRastogi Итак, этот вопрос для Linux? –

ответ

11

Из Inotify страницы руководства:

IN_CREATE   File/directory created in watched directory (*). 

Это может быть сделано, ловя это событие.

Опять из страницы руководства:

Limitations and caveats 
     Inotify monitoring of directories is not recursive: to monitor subdirectories under a directory, additional watches must be created. This can take a significant 
     amount time for large directory trees. 

Итак, вам нужно будет сделать рекурсивной части себя. Вы можете начать с примера с here. Вы также должны взглянуть на проект notify-tools

Пример, как просили в комментариях: Он контролирует /tmp/inotify1 & /tmp/inotify2 для новых файлов, созданных с & отображает события

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/inotify.h> 

#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define BUF_LEN  (1024 * (EVENT_SIZE + 16)) 

int main(int argc, char **argv) 
{ 
    int length, i = 0; 
    int fd; 
    int wd[2]; 
    char buffer[BUF_LEN]; 

    fd = inotify_init(); 

    if (fd < 0) { 
     perror("inotify_init"); 
    } 

    wd[0] = inotify_add_watch(fd, "/tmp/inotify1", IN_CREATE); 
    wd[1] = inotify_add_watch (fd, "/tmp/inotify2", IN_CREATE); 

    while (1){ 
     struct inotify_event *event; 

     length = read(fd, buffer, BUF_LEN); 

     if (length < 0) { 
      perror("read"); 
     } 

     event = (struct inotify_event *) &buffer[ i ]; 

     if (event->len) { 
      if (event->wd == wd[0]) printf("%s\n", "In /tmp/inotify1: "); 
      else printf("%s\n", "In /tmp/inotify2: "); 
      if (event->mask & IN_CREATE) { 
       if (event->mask & IN_ISDIR) { 
        printf("The directory %s was created.\n", event->name);  
       } 
       else { 
        printf("The file %s was created.\n", event->name); 
       } 
      } 
     } 
    } 
    (void) inotify_rm_watch(fd, wd[0]); 
    (void) inotify_rm_watch(fd, wd[1]); 
    (void) close(fd); 

    exit(0); 
} 

Пробное:

[email protected] ~ $ ./a.out 
In /tmp/inotify1: 
The file abhijeet was created. 
In /tmp/inotify2: 
The file rastogi was created. 
^C 
[email protected] ~ $ 
+0

Thx, но мне нужен пример кода c или C++. Вы можете помочь? –

+1

@justAngela Помимо ссылки IBM, которую я дал, вот еще одно, что входит в поиск Google. http://www.thegeekstuff.com/2010/04/inotify-c-program-example/. Кроме того, почему бы вам не посмотреть исходный код inotiwatch https://github.com/rvoicilas/inotify-tools/blob/master/src/inotify? –

+0

Я взял у источника ... но ничто не работает для меня: ((пожалуйста, напечатайте пример лучше, чем у меня, если у вас есть. Вторая ссылка не работает для меня –

1

Существует также fanotify. С его помощью вы можете установить часы на всей точке монтирования. Посмотрите пример кода here.