Как получить уведомления об изменении папки (наблюдатель за папкой) в какао

Я новичок в разработке приложений Cocoa. Я хочу, чтобы мое приложение уведомлялось об изменении любого файла в данном каталоге (наблюдатель за папками). Изменено означает удаление, добавление, изменение содержимого файла. Я пробовал использовать FSEvents также с использованием центра уведомлений NSWorkspace или делегированных сообщений, как в UKKQueue по адресу http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue. Мое приложение получило уведомление при изменении любого файла в каталоге. Но проблема в том, что он не дает имя или путь к конкретному файлу, который изменяется. Он дает путь к каталогу, но не путь к конкретному файлу.

Любая идея, как я могу просмотреть папку для модификации в конкретном файле ??


person Amrinder Singh    schedule 19.12.2011    source источник
comment
возможный дубликат Наблюдение за файлом или папкой в ​​Objective-C   -  person Rob Keniger    schedule 20.12.2011
comment
kqueues будет отслеживать изменения в отдельных файлах, но вы должны настроить мониторинг для каждого файла самостоятельно. UKKQueue не слишком хорошо подходит для этого из коробки, так как допускает только одного делегата.   -  person Rob Keniger    schedule 20.12.2011
comment
Есть ли другой способ, с помощью которого я могу просматривать папку по моему требованию ??   -  person Amrinder Singh    schedule 21.12.2011


Ответы (2)


Вам нужно написать код для отслеживания содержимого папки, а затем всякий раз, когда вы получаете FSEvent уведомление об изменении содержимого папки, вам необходимо сравнить сохраненную информацию о содержимом папки с фактическим текущим содержимым.

Это может быть что-то столь же простое, как изменяемый массив ivar с именем что-то вроде folderContents, который содержит набор словарей атрибутов файлов. Вы можете использовать словарь, возвращаемый методом -attributesOfItemAtPath:error: метода NSFileManager, или его подмножество.

Все, что вам нужно сделать, когда вы получите уведомление о папке, — это просмотреть сохраненные словари и проверить, были ли добавлены, удалены или изменены какие-либо файлы. Словарь атрибутов NSFileManager содержит всю необходимую для этого информацию.

Затем вам нужно будет обновить сохраненную информацию о папке обновленной информацией.

person Rob Keniger    schedule 21.12.2011
comment
Можете ли вы предоставить мне пример кода для этого, потому что, как я уже сказал, я новичок в разработке приложений Cocoa. - person Amrinder Singh; 22.12.2011

NSMetadataQuery хорошо работает для просмотра папок:

- (void)setupWatchedFolder {
    NSString *watchedFolder = @"/path/to/foo";

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
    [query setSearchScopes:@[watchedFolder]];
    [query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*.*'", NSMetadataItemFSNameKey]];

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(queryFoundStuff:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
    [nc addObserver:self selector:@selector(queryFoundStuff:) name:NSMetadataQueryDidUpdateNotification object:query];

    [query startQuery];
}

- (void)queryFoundStuff:(NSNotification *)notification {

    NSMetadataQuery *query = self.metadataQuery;
    [query disableUpdates];

    NSMutableArray *results = [NSMutableArray arrayWithCapacity:self.metadataQuery.resultCount];

    for (NSUInteger i=0; i<self.metadataQuery.resultCount; i++) {
        [results addObject:[[self.metadataQuery resultAtIndex:i] valueForAttribute:NSMetadataItemPathKey]];
    }

    // do something with you search results
    // self.results = results;

    [query enableUpdates];
}
person mrwalker    schedule 23.08.2012
comment
Это кажется хорошей идеей, но я не могу заставить ее работать. QueryFoundStuff никогда не вызывается. - person Matthieu Riegler; 21.01.2014
comment
@MatthieuRiegler Я обновил предикат запроса, чтобы он соответствовал тому, что я использую в своем приложении. - person mrwalker; 21.01.2014
comment
Можно ли использовать NSMetadataQuery + NSNotificationCenter для получения только действия (переименование файла, перемещение файла, добавление файла) с полным именем пути без необходимости повторения всей отслеживаемой папки и сопоставления с последний снимок папки? Я пытаюсь реализовать DirectoryWatcher, чтобы информировать другие части кода, когда файл был удален, добавлен или переименован в отслеживаемой папке. Мне нравится отправлять action+filePath. Не могли бы вы дать мне подсказку? Спасибо - person DoK; 15.01.2016