通知iPhone / Documents目录的更改

我们有一个使用文件共享的应用程序。 UIFileSharingEnable设置等,这一切似乎工作正常,但我正在寻找某种types的文件已被添加/删除在iPhone端的通知。 任何人都可以build议吗?

提前欢呼。

Apple开发者论坛上的这个主题可能会引起人们的兴趣,其中build议您在自己的主题中运行kqueue ,跟踪应用程序的Documents文件夹。

苹果技术公司在这里跟进了一些示例代码 :

- (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); } 

这是一个使用Grand Central Dispatch(GCD)的替代解决scheme,它允许您从NSNotificationCenter接收文件更改通知:

将这些variables添加到类的接口:

 // Dispatch queue dispatch_queue_t _dispatchQueue; // A source of potential notifications dispatch_source_t _source; 

将下面的代码添加到实现中:

  #define fileChangedNotification @"fileChangedNotification" // Get the path to the home directory NSString * homeDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; // Create a new file descriptor - we need to convert the NSString to a char * ie C style string int filedes = open([homeDirectory cStringUsingEncoding:NSASCIIStringEncoding], O_EVTONLY); // Create a dispatch queue - when a file changes the event will be sent to this queue _dispatchQueue = dispatch_queue_create("FileMonitorQueue", 0); // Create a GCD source. This will monitor the file descriptor to see if a write command is detected // The following options are available /*! * @typedef dispatch_source_vnode_flags_t * Type of dispatch_source_vnode flags * * @constant DISPATCH_VNODE_DELETE * The filesystem object was deleted from the namespace. * * @constant DISPATCH_VNODE_WRITE * The filesystem object data changed. * * @constant DISPATCH_VNODE_EXTEND * The filesystem object changed in size. * * @constant DISPATCH_VNODE_ATTRIB * The filesystem object metadata changed. * * @constant DISPATCH_VNODE_LINK * The filesystem object link count changed. * * @constant DISPATCH_VNODE_RENAME * The filesystem object was renamed in the namespace. * * @constant DISPATCH_VNODE_REVOKE * The filesystem object was revoked. */ // Write covers - adding a file, renaming a file and deleting a file... _source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,filedes, DISPATCH_VNODE_WRITE, _dispatchQueue); // This block will be called when teh file changes dispatch_source_set_event_handler(_source, ^(){ // We call an NSNotification so the file can change can be detected anywhere [[NSNotificationCenter defaultCenter] postNotificationName:fileChangedNotification object:Nil]; }); // When we stop monitoring the file this will be called and it will close the file descriptor dispatch_source_set_cancel_handler(_source, ^() { close(filedes); }); // Start monitoring the file... dispatch_resume(_source); //... // When we want to stop monitoring the file we call this //dispatch_source_cancel(source); // To recieve a notification about the file change we can use the NSNotificationCenter [[NSNotificationCenter defaultCenter] addObserverForName:fileChangedNotification object:Nil queue:Nil usingBlock:^(NSNotification * notification) { NSLog(@"File change detected!"); }]; 

老问题,但我碰到这个包含目录监视器的苹果代码 。 请注意,它会触发添加(或删除)文件的时刻。 这可能在操作系统完成写入文件之前。