我想监控一些目录中新文件的创建,并阅读有关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);这对于根目录是可以的,1级子目录也会被监视,但是当我尝试将监视添加到2级子目录时,路径是不正确的。
用netbeans7.2,ubuntu12编写c++。
发布于 2013-07-17 09:31:06
我有一个关于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 );
}
}https://stackoverflow.com/questions/14215912
复制相似问题