Как получить уведомления об изменениях папок (watcher) в какао - PullRequest
3 голосов
/ 19 декабря 2011

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

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

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

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

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

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

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

5 голосов
/ 23 августа 2012

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...