How to monitor a folder with all subfolders and files inside?

后端 未结 2 939
无人及你
无人及你 2020-12-16 19:41

I have a folder called \"Datas\". This folder has a subfolder called \"Inbox\" inside of which there are multiple \".txt\" files. This \"Datas\" folder can be modified and i

2条回答
  •  囚心锁ツ
    2020-12-16 20:20

    From the inotify manpage:

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

    It can be done by catching this event.

    Again from the manpage:

      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.
    

    So, you will need to do the recursive part yourself. You can start by looking an example from here. You should also have a look at the project notify-tools

    EXAMPLE as asked in comments: It monitors /tmp/inotify1 & /tmp/inotify2 for new files created & displays the events

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

    Test run:

    shadyabhi@archlinux ~ $ ./a.out 
    In /tmp/inotify1: 
    The file abhijeet was created.
    In /tmp/inotify2: 
    The file rastogi was created.
    ^C
    shadyabhi@archlinux ~ $
    

提交回复
热议问题