Oglądam katalog zdarzeń systemu plików. Wszystko wydaje się działać dobrze z jednym wyjątkiem. Kiedy utworzę plik za pierwszym razem, wypluwa on, że został utworzony. Wtedy mogę go usunąć i mówi, że został usunięty. Kiedy idę do utworzenia tego samego pliku ponownie, otrzymuję jednocześnie flagę utworzoną i usuniętą. Oczywiście nie rozumiem, w jaki sposób flagi są ustawiane podczas wywoływania wywołania zwrotnego. Co tu się dzieje?OSX FSEventStreamEventFlags nie działa poprawnie
//
// 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;
}
podobne issue: https://github.com/haskell-fswatch/hfsnotify/issues/36 –
Z Twojego kodu wywołania nie widzę żadnego sposobu, aby oba zostały usunięte i utworzone w tym samym czasie. Muszą być drukowane w oddzielnych callbackach. (Masz, jeśli() else if().) –
Czy sprawdziłeś, czy usunięcie flagi 'kFSEventStreamCreateFlagNoDefer' zmienia coś? – JSuar