我正在使用FSEvents
偵聽Cocoa項目中的目錄和磁盤更改。當根文件夾被重命名或刪除時,我需要獲取事件。所以,我通過kFSEventStreamCreateFlagWatchRoot
,同時創建了FSEventStream
。但即使我刪除或重命名根文件夾我沒有得到相應的FSEventStreamEventFlags
。任何想法可能是什麼問題。我正在監聽USB安裝設備的更改。我同時使用了FSEventStreamCreate
和FSEventStreamCreateRelativeToDevice
。有一件事我通知是當我嘗試用FSEventStreamCreate
我收到以下錯誤消息在創建FSEventStream
:如何監聽文件系統更改MAC - kFSEventStreamCreateFlagWatchRoot
(
CarbonCore.framework
)FSEventStreamCreate
:watch_all_parents
:
錯誤嘗試添加的kqueue爲fd 7
(/Volumes/NO NAME
;不支持操作)
但與FSEventStreamCreateRelativeToDevice
有沒有錯誤,但仍沒有得到kFSEventStreamEventFlagRootChanged
事件標誌。此外,雖然創建使用FSEventStreamCreateRelativeToDevice
蘋果說,如果我想聽根路徑變化通過emty字符串""
。但是我不能通過傳遞空字符串來偵聽根路徑變化。但是,當我通過"/"
它的作品。但即使對於"/"
我也沒有得到任何正確的FSEventStreamEventFlags
。我在這裏粘貼代碼:
-(void) subscribeFileSystemChanges:(NSString*) path
{
PRINT_FUNCTION_BEGIN;
// if already subscribed then unsubscribe
if (stream)
{
FSEventStreamStop(stream);
FSEventStreamInvalidate(stream); /* will remove from runloop */
FSEventStreamRelease(stream);
}
FSEventStreamContext cntxt = {0};
cntxt.info = self;
CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void**)&path, 1, NULL);
stream = FSEventStreamCreate(NULL, &feCallback, &cntxt,
pathsToWatch, kFSEventStreamEventIdSinceNow, 1,
kFSEventStreamCreateFlagWatchRoot);
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),
kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
}
回調函數:
static void feCallback(ConstFSEventStreamRef streamRef, void* pClientCallBackInfo,
size_t numEvents, void* pEventPaths, const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
char** ppPaths = (char**)pEventPaths; int i;
for (i = 0; i < numEvents; i++)
{
NSLog(@"Event Flags %lu Event Id %llu", eventFlags[i], eventIds[i]);
NSLog(@"Path changed: %@",
[NSString stringWithUTF8String:ppPaths[i]]);
}
}
非常感謝提前。
我不知道那裏有什麼問題,因爲我從來沒有使用過FSEvents。話雖如此,這聽起來像你試圖做的可能會更好地使用DiskArbitration框架完成。 – 2010-01-28 16:02:06