Я хочу следить за созданием новых файлов в некоторых каталогах и читать эту ссылку о 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, путь не правильный.
писать на c ++ с netbeans7.2, ubuntu12.
У меня есть рабочий образец на 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 );
}
}
Других решений пока нет …