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

Аз съм нов в разработката на приложения за какао. Искам приложението ми да бъде уведомявано, когато някой файл в дадена директория бъде променен (наблюдател на папки). Променен означава изтрит, добавен, съдържанието на файла е променено. Опитах се да използвам 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
Можете ли да ми предоставите примерен код за това, защото, както казах, съм нов в разработката на приложения за какао. - 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