ファイルシステムイベントのディレクトリを監視しています。 1つの例外を除いてすべてがうまくいくようです。私が最初にファイルを作成すると、それが作成されたことが分かります。それから私はそれを取り除くことができ、それは削除されたと言います。同じファイルを再び作成すると、同時に作成されたフラグと削除されたフラグが取得されます。私は明らかにコールバックが呼び出されているときにどのようにフラグがセットされているのか誤解しています。ここで何が起きてるの?OSX FSEventStreamEventFlagsが正しく動作しない
//
// 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;
}
問題:https://github.com/haskell-fswatch/hfsnotify/issues/36 –
あなたのコールバックコードからは、同時に削除と作成の両方を行うことはできません。別のコールバックで印刷する必要があります。 (あなたはif()else if()を持っています) –
'kFSEventStreamCreateFlagNoDefer'フラグの削除が何か変わるかどうかテストしましたか? – JSuar