我想监视某些目录中新文件的创建,并阅读有关inotify的链接。我喜欢这个实现并使用它。但是,在我的情况下,我想监视一个目录,该目录最多有3级子目录。
我的想法是每次创建一个新目录时添加一个监视,但为了做到这一点,我需要知道创建目录的路径。不幸的是,inotify
的事件结构只能给我创建的文件目录的名称,而不是它的路径。有人可以提出这个想法吗?
add_watch(fd,root);
if ( event->mask & IN_CREATE) {
if (event->mask & IN_ISDIR){
printf("%d DIR::%s CREATED\n", event->wd,event->name );
strcpy(new_dir,root);
strcat(new_dir,"/");
strcat(new_dir,event->name);
add_watch(fd,new_dir);
其中add_watch是:
void add_watch(int fd, char *root)
{
int wd;
struct dirent *entry;
DIR *dp;
dp = opendir(root);
if (dp == NULL)
{
perror("Error opening the starting directory");
exit(0);
}
/* add watch to starting directory */
wd = inotify_add_watch(fd, root, IN_CREATE | IN_MODIFY | IN_MOVED_TO);
这对于根目录是可以的,也可以看到level-1子目录,但是当我尝试将监视添加到level-2子目录时,路径不正确。
使用netbeans7.2,ubuntu12在c ++中编写。
答案 0 :(得分:0)
我在Github上有一个支持inotify目录创建/删除事件的工作示例。 一个小的Watch类负责将wd(监视描述符)映射到文件/文件夹名称。 这是一个片段,展示了如何处理inotify CREATE和DELETE事件。 完整示例位于Github。
if ( event->mask & IN_CREATE ) {
current_dir = watch.get(event->wd);
if ( event->mask & IN_ISDIR ) {
new_dir = current_dir + "/" + event->name;
wd = inotify_add_watch( fd, new_dir.c_str(), WATCH_FLAGS );
watch.insert( event->wd, event->name, wd );
total_dir_events++;
printf( "New directory %s created.\n", new_dir.c_str() );
} else {
total_file_events++;
printf( "New file %s/%s created.\n", current_dir.c_str(), event->name );
}
} else if ( event->mask & IN_DELETE ) {
if ( event->mask & IN_ISDIR ) {
new_dir = watch.erase( event->wd, event->name, &wd );
inotify_rm_watch( fd, wd );
total_dir_events--;
printf( "Directory %s deleted.\n", new_dir.c_str() );
} else {
current_dir = watch.get(event->wd);
total_file_events--;
printf( "File %s/%s deleted.\n", current_dir.c_str(), event->name );
}
}