Ich beobachte ein Verzeichnis für Dateisystemereignisse. Alles scheint mit einer Ausnahme gut zu funktionieren. Wenn ich eine Datei zum ersten Mal erstelle, spuckt sie aus, dass sie erstellt wurde. Dann kann ich es entfernen und es sagt, dass es entfernt wurde. Wenn ich dieselbe Datei erneut erstelle, erhalte ich gleichzeitig eine erstellte und entfernte Flagge. Ich verstehe offensichtlich nicht, wie die Flags gesetzt werden, wenn der Callback aufgerufen wird. Was passiert hier?OSX FSEventStreamEventFlags funktioniert nicht richtig
//
// 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;
}
Ähnliche Problem: https://github.com/haskell-fswatch/hfsnotify/issues/36 –
Aus Ihrem Rückruf-Code sehe ich keine Möglichkeit, die Sie beide gleichzeitig entfernen und erstellen können. Sie müssen in separaten Rückrufen gedruckt werden. (Sie haben if() sonst if().) –
Haben Sie getestet, ob das Entfernen des Flags 'kFSEventStreamCreateFlagNoDefer' etwas ändert? – JSuar