【发布时间】:2013-08-24 05:33:02
【问题描述】:
我正在监视文件系统事件的目录。除了一个例外,一切似乎都运行良好。当我第一次创建文件时,它会吐出它已创建。然后我可以删除它,它说它已被删除。当我再次创建同一个文件时,我同时得到一个创建和删除标志。我显然误解了在调用回调时如何设置标志。这里发生了什么?
//
// main.c
// GoFSEvents
//
// Created by Kyle Cook on 8/22/13.
// Copyright (c) 2013 Kyle Cook. All rights reserved.
//
#include <CoreServices/CoreServices.h>
#include <stdio.h>
#include <string.h>
void eventCallback(FSEventStreamRef stream, void* callbackInfo, size_t numEvents, void* paths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) {
char **pathsList = paths;
for(int i = 0; i<numEvents; i++) {
uint32 flag = eventFlags[i];
uint32 created = kFSEventStreamEventFlagItemCreated;
uint32 removed = kFSEventStreamEventFlagItemRemoved;
if(flag & removed) {
printf("Item Removed: %s\n", pathsList[i]);
}
else if(flag & created) {
printf("Item Created: %s\n", pathsList[i]);
}
}
}
int main(int argc, const char * argv[])
{
CFStringRef mypath = CFSTR("/path/to/dir");
CFArrayRef paths = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL);
CFRunLoopRef loop = CFRunLoopGetMain();
FSEventStreamRef stream = FSEventStreamCreate(NULL, (FSEventStreamCallback)eventCallback, NULL, paths, kFSEventStreamEventIdSinceNow, 1.0, kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagNoDefer);
FSEventStreamScheduleWithRunLoop(stream, loop, kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
CFRunLoopRun();
FSEventStreamStop(stream);
FSEventStreamInvalidate(stream);
FSEventStreamRelease(stream);
return 0;
}
【问题讨论】:
-
从您的回调代码中,我看不出有任何方法可以同时删除和创建。它们必须在单独的回调中打印。 (你有 if () else if ()。)
-
您是否测试过删除
kFSEventStreamCreateFlagNoDefer标志是否有任何改变? -
我得到了同样的行为......以前我使用过 kqueue:gist.github.com/nielsbot/5155671 也许这很有帮助。
标签: c macos core-foundation fsevents