【问题标题】:How to monitor a folder with all subfolders and files inside?如何监视包含所有子文件夹和文件的文件夹?
【发布时间】:2012-02-22 10:36:40
【问题描述】:

我有一个名为“Datas”的文件夹。此文件夹有一个名为“收件箱”的子文件夹,其中有多个“.txt”文件。这个“Datas”文件夹可以修改,最后会有多个子文件夹,里面有“Inbox”子文件夹和“.txt”文件。我需要监视“数据”文件夹和“收件箱”文件夹中的“.txt”文件。我该怎么做?

INotify 只是监视文件夹并在创建子文件夹时弹出事件。创建“.txt”文件时如何弹出事件(在哪个文件夹中)?

我需要 C 或 C++ 代码,但我被卡住了。我不知道如何解决这个问题。

【问题讨论】:

  • @VJovic inotify 是特定于 linux 的。
  • @AbhijeetRastogi 那么,这个问题是针对 linux 的吗?
  • @VJovic 是的。我很确定。
  • 你可以使用libfam

标签: c++ c linux monitor


【解决方案1】:

来自 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

cmets 中询问的示例:它监视 /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 ~ $

【讨论】:

【解决方案2】:

还有fanotify。有了它,您可以在整个挂载点上设置监视。查看示例代码here

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 2014-01-14
    • 1970-01-01
    • 2019-07-02
    • 2014-01-03
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多