我使用 SCEvents 实现了文件观察器部分:https ://github.com/mz2/SCEvents它在文件创建、修改、删除或重命名时通知我,如下所示:
2014-02-11 16:08:38.725 TestSCEvent10-2[2995:403] SCEvent { eventId = 3182336, eventPath = /Users/user1/Desktop, eventFlags = 131328 }
它返回父目录的路径。我应该如何获得修改文件的完整路径?
在 SCEvents.m 文件中
将 FSEventStreamCreateFlags 常量 kFSEventStreamCreateFlagFileEvents添加到FSEventStreamCreate 标志,如下所示:
static FSEventStreamRef _create_events_stream(SCEvents *watcher, CFArrayRef paths, CFTimeInterval latency, FSEventStreamEventId sinceWhen)
{
FSEventStreamContext callbackInfo;
callbackInfo.version = 0;
callbackInfo.info = (void *)watcher;
callbackInfo.retain = NULL;
callbackInfo.release = NULL;
callbackInfo.copyDescription = NULL;
return FSEventStreamCreate(kCFAllocatorDefault,
&_events_callback,
&callbackInfo,
paths,
sinceWhen,
latency,
kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagWatchRoot |kFSEventStreamCreateFlagFileEvents);
}
kFSEventStreamCreateFlagFileEvents
请求文件级通知。您的流将接收有关您正在观看的层次结构中各个文件的事件,而不仅仅是接收目录级别的通知。小心使用这个标志,因为它会比没有它产生更多的事件。在 OS X v10.7 及更高版本中可用。
在 FSEvents.h 中声明。
讨论
可以传递给 FSEventStreamCreate...() 函数以修改正在创建的流的行为的标志。
将更改 eventPath 以输出完整的文件路径。
更新:
在 SCEvents.m 文件中还有延迟设置。
// 常量 static const CGFloat SCEventsDefaultNotificationLatency = 3.0;
它可以设置为 3.0。我将我的设置为 8.00。
“延迟”参数,告诉在事件发生后等待多长时间再转发它;这减少了事件的数量并减少了客户端看到“中间”状态的机会,例如在“安全保存”文件、创建包或通过 Safari 下载文件时出现的那些“