2012-01-30 23 views
9

Mam folder o nazwie "Datas". Ten folder ma podfolder o nazwie "Skrzynka odbiorcza", w której znajduje się wiele plików ".txt". Ten folder "Datas" można zmodyfikować, a na końcu będzie wiele podfolderów z podfolderami "Skrzynka odbiorcza" i plikami ".txt". Muszę monitorować folder "Datas" i plik ".txt" w folderze "Skrzynka odbiorcza". Jak mogę to zrobić?Jak monitorować folder zawierający wszystkie podfoldery i pliki?

INotify monitoruje folder i wyświetla zdarzenia podczas tworzenia podfolderów. Jak tworzyć zdarzenia, gdy tworzone są pliki ".txt" (w którym folderze)?

Potrzebuję kodu C lub C++, ale utknąłem. Nie wiem jak to rozwiązać.

+3

którego systemu operacyjnego? –

+2

@VJovic inotify jest specyficzne dla systemu Linux. –

+1

@AbhijeetRastogi Tak, to pytanie jest dla Linuksa? –

Odpowiedz

11

Z podręcznika inotify:

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

Można to zrobić poprzez łapanie to wydarzenie.

ponownie z podręcznika:

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. 

Tak, trzeba będzie zrobić rekurencyjnego part siebie. Możesz zacząć od obejrzenia przykładu z here. Należy również spojrzeć na projekt notify-tools

przykład jak zadawane w komentarzach: Monitoruje /tmp/inotify1 & /tmp/inotify2 dla nowych plików tworzony & wyświetla wydarzenia

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

Run Test:

[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, ale potrzebuję przykładowego kodu c lub C++. Czy możesz pomóc? –

+1

@justAngela Oprócz linku podanego przez IBM, tutaj jest jeszcze jeden, który pojawia się w wyszukiwarce Google. http://www.thegeekstuff.com/2010/04/inotify-c-program-example/. Ponadto, dlaczego nie patrzysz na kod źródłowy inotiwatch https://github.com/rvoicilas/inotify-tools/blob/master/src/inotify? –

+0

wziąłem w źródle .. ale nic nie działa dla mnie: ((proszę wydrukować przykład lepszy niż mój, jeśli masz.) Drugi link nie działa dla mnie –

1

Istnieje również fanotify. Dzięki niemu możesz ustawić zegarek na całym punkcie montowania. Sprawdź przykładowy kod here.

Powiązane problemy