This thread sur les forums Apple Developer peut être intéressant, dans lequel il est suggéré que vous exécutez un kqueue dans son propre thread, le suivi du dossier Documents de l'application.
Une technologie d'Apple a suivi avec une sample code here:
- (void)kqueueFired
{
int kq;
struct kevent event;
struct timespec timeout = { 0, 0 };
int eventCount;
kq = CFFileDescriptorGetNativeDescriptor(self->_kqRef);
assert(kq >= 0);
eventCount = kevent(kq, NULL, 0, &event, 1, &timeout);
assert((eventCount >= 0) && (eventCount < 2));
if (eventCount == 1) {
NSLog(@"dir changed");
}
CFFileDescriptorEnableCallBacks(self->_kqRef, kCFFileDescriptorReadCallBack);
}
static void KQCallback(CFFileDescriptorRef kqRef, CFOptionFlags callBackTypes, void *info)
{
ViewController * obj;
obj = (ViewController *) info;
assert([obj isKindOfClass:[ViewController class]]);
assert(kqRef == obj->_kqRef);
assert(callBackTypes == kCFFileDescriptorReadCallBack);
[obj kqueueFired];
}
- (IBAction)testAction:(id)sender
{
#pragma unused(sender)
NSString * docPath;
int dirFD;
int kq;
int retVal;
struct kevent eventToAdd;
CFFileDescriptorContext context = { 0, self, NULL, NULL, NULL };
CFRunLoopSourceRef rls;
docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
assert(docPath != 0);
NSLog(@"%@", docPath);
dirFD = open([docPath fileSystemRepresentation], O_EVTONLY);
assert(dirFD >= 0);
kq = kqueue();
assert(kq >= 0);
eventToAdd.ident = dirFD;
eventToAdd.filter = EVFILT_VNODE;
eventToAdd.flags = EV_ADD | EV_CLEAR;
eventToAdd.fflags = NOTE_WRITE;
eventToAdd.data = 0;
eventToAdd.udata = NULL;
retVal = kevent(kq, &eventToAdd, 1, NULL, 0, NULL);
assert(retVal == 0);
assert(self->_kqRef == NULL);
self->_kqRef = CFFileDescriptorCreate(NULL, kq, true, KQCallback, &context);
assert(self->_kqRef != NULL);
rls = CFFileDescriptorCreateRunLoopSource(NULL, self->_kqRef, 0);
assert(rls != NULL);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
CFRelease(rls);
CFFileDescriptorEnableCallBacks(self->_kqRef, kCFFileDescriptorReadCallBack);
}
Fonctionne un régal! Merci Alex. –
Vous devrez inclure ces en-têtes: '#include #include #include #include #include ' –
Dustin
si je veux quand le moniteur et trouver des fichiers dans le dossier documents appel certaine fonction, aussi où je mets ces trois fonctions, dans la classe appdelegate ou quoi – AMH