Как отслеживать папку со всеми подпапками и файлами внутри? - PullRequest
9 голосов
/ 30 января 2012

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

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

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

Ответы [ 2 ]

11 голосов
/ 30 января 2012

С man-страницы inotify:

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

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

Снова с man-страницы:

  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.

Итак, вам нужно будет выполнить рекурсивную часть самостоятельно.Вы можете начать с примера из здесь .Вам также следует взглянуть на проект 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 );
}

Тестовый прогон:

shadyabhi@archlinux ~ $ ./a.out 
In /tmp/inotify1: 
The file abhijeet was created.
In /tmp/inotify2: 
The file rastogi was created.
^C
shadyabhi@archlinux ~ $
1 голос
/ 30 января 2012

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

...