1

我使用 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 }

它返回父目录的路径。我应该如何获得修改文件的完整路径?

4

1 回答 1

4

在 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 下载文件时出现的那些“

于 2014-02-11T12:31:09.660 回答