2011-08-17 3 views
0

Я пытаюсь контролировать выпуск одного файла с помощью kqueue через обертку под названием UKKQueue here. Эта оболочка очень просто, вот тестовый код, я использую:остановка файла после сохранения файла

@implementation FileMonitorTestAppDelegate 

@synthesize window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    fileWatcher = [[UKKQueue alloc] init]; 
    [fileWatcher addPath:@"/Users/bruno/Desktop/SyncTestLog"]; 
    [fileWatcher setDelegate:self]; 
} 

- (void)dealloc { 
    [fileWatcher release]; 
} 

-(void) watcher: (id<UKFileWatcher>)kq receivedNotification: (NSString*)nm forPath: (NSString*)fpath { 
    NSLog(@"UKFileWatcher: %@ - notification: %@ - filePath: %@", kq, nm, fpath); 
} 

@end 

Файл в /Users/bruno/Desktop/SyncTestLog представляет собой обычный текстовый файл. Когда я изменить его с помощью nano из терминала Выходные данные показывают, как ожидалось:

2011-08-17 11:46:27.316 FileMonitorTest[1235:707] UKFileWatcher: <UKKQueue: 0x100117da0> - notification: UKKQueueFileWrittenToNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 11:46:27.317 FileMonitorTest[1235:707] UKFileWatcher: <UKKQueue: 0x100117da0> - notification: UKKQueueFileSizeIncreasedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 11:46:27.751 FileMonitorTest[1235:707] UKFileWatcher: <UKKQueue: 0x100117da0> - notification: UKKQueueFileAttributesChangedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 

Теперь, когда я изменить его с помощью TextEdit или TextWrangler на изменения отчетов мониторинга стоп после первого раза я сохранить файл. Heres сообщается последние события:

2011-08-17 10:57:45.792 FileMonitorTest[897:707] UKFileWatcher: <UKKQueue: 0x10035ae10> - notification: UKKQueueFileAttributesChangedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 10:57:46.463 FileMonitorTest[897:707] UKFileWatcher: <UKKQueue: 0x10035ae10> - notification: UKKQueueFileAttributesChangedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 
2011-08-17 10:57:54.043 FileMonitorTest[897:707] UKFileWatcher: <UKKQueue: 0x10035ae10> - notification: UKKQueueFileDeletedNotification - filePath: /Users/bruno/Desktop/SyncTestLog 

Насколько я понимаю, UKKQueue получает Unix-подобный файловый дескриптор с open() используя флаг O_EVTONLY. По какой-то причине TextEdit (и TextWrangler) генерируют это уведомление UKKQueueFileDeletedNotification при сохранении файла.

Что мне нужно, так что продолжайте слушать изменения в файле «навсегда». Я полагаю, что я могу создать монитор, когда придет UKKQueueFileDeletedNotification, но я ищу что-то более чистое.

Благодаря

Edit: Я просто нашел в Google Toolbox For Mac класс называется GTMFileSystemKQueue, что решат мою проблему. Еще нет ответа на мой вопрос.

ответ

3

Я переписал UKKQueue в современной Objective-C. Новый класс работает одинаково, он просто лучше, быстрее и рационален. Он также исправляет ошибку, описанную в этом сообщении, а также несколько других.

Вы можете найти новый класс, VDKQueue, здесь: http://github.com/bdkjones/VDKQueue

+0

Hi Bryan. Большое спасибо за то, что мы знаем об этом. С наилучшими пожеланиями –

+0

У меня такая же проблема с VDKQueue, как у GojaN с UKKQueue. После сохранения текстового файла он запускается один раз, а затем останавливается. Есть идеи? – bijan

+0

@bijan и GojaN, вы нашли решение для этого в UKKQueue или VDKQueue. Я также сталкиваюсь с той же проблемой. – Subhash

1

Гоча здесь является то, что TextEdit и TextWrangler используют безопасный сохранить (или ...atomically:YES), не писать прямо в файл, но сначала пишет временный файл, а затем переименовывает файлы, чтобы заменить исходный путь файлом, сохраненным во временном месте.

Эффект этого вашего kqueue будет контролировать исходный файл, который с тех пор будет удален механизмом безопасного сохранения.

GTMFileSystemKQueue работает из-за параметра acrossReplace, который следит за действиями удаления/переименования и перезаписывает kqueue по исходному пути. Быстрая проверка UKKQueue и VDKQueue, по-видимому, предполагает, что это не так.