0

kqueue我正在尝试通过一个名为 UKKQueue 的包装器来监控单个文件的版本,这里提供。这个包装器非常简单,这是我正在使用的测试代码:

@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 对其进行编辑时,在我第一次保存文件后,监控停止报告更改。以下是报告的最后事件:

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 使用open()使用 flag获取类似 unix 的文件描述符O_EVTONLY。出于某种原因,TextEdit(和 TextWrangler)UKKQueueFileDeletedNotification在保存文件时会生成此通知。

我需要的是“永远”继续监听文件中的更改。我想我可以在UKKQueueFileDeletedNotification到达时重新创建监视器,但我正在寻找更干净的东西。

谢谢

编辑: 我刚刚在Google Toolbox For Mac中找到了一个名为GTMFileSystemKQueue的类,它可以解决我的问题。我的问题仍然没有答案。

4

2 回答 2

3

我用现代 Objective-C 重写了 UKKQueue。新课程的工作方式相同,只是更好、更快、更精简。它还修复了这篇文章中描述的错误以及其他几个错误。

您可以在此处找到新类 VDKQueue:http: //github.com/bdkjones/VDKQueue

于 2012-03-30T02:50:29.340 回答
1

这里的问题是 TextEdit 和 TextWrangler 正在使用安全保存(或...atomically:YES),它不会直接写入文件,而是首先写入临时文件,然后重命名文件以将原始路径替换为保存在临时位置的文件。

这样做的效果是您的 kqueue 将监视将被安全保存机制删除的原始文件。

GTMFileSystemKQueue 之所以起作用,是因为该acrossReplace参数监视删除/重命名操作并根据原始路径重新注册 kqueue。对 UKKQueue 和 VDKQueue 的快速检查似乎表明两者都不这样做。

于 2012-10-23T12:22:56.087 回答