我有一个名为“数据”的文件夹。此文件夹有一个名为“收件箱”的子文件夹,其中有多个“ .txt”文件。可以修改“数据”文件夹,最后会有多个带有“收件箱”子文件夹和“ .txt”文件的子文件夹。我需要监视“收件箱”文件夹中的“数据”文件夹和“ .txt”文件。我怎样才能做到这一点?
INotify只是监视文件夹,并在创建子文件夹时弹出事件。创建“ .txt”文件(在哪个文件夹中)时,如何弹出事件?
我需要C或C ++代码,但被卡住了。我不知道该怎么解决。
从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.
因此,您将需要自己执行递归部分。您可以从这里开始看一个例子。您还应该看看项目的通知工具
注释中要求的示例 :它监视/tmp/inotify1&/tmp/inotify2查找创建的新文件并显示事件
/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 ~ $