2012-12-05 25 views
0

有人可以告訴我這段代碼不工作嗎?在監視iOS 6.0中的應用程序文檔目錄時,它始終返回DISPATH_VNODE_WRITE。 (iPad)下面是我的代碼。它總是返回0x2,無論文件被刪除或重命名或添加:(這是因爲它是我監測的目錄?不是文件!!!有什麼方法可以找出導致目錄發送通知的原因?dispatch_source_get_data在監視目錄時不返回正確的標誌

int directoryFileDescripter = open([documentDirectory UTF8String], O_EVTONLY); 

if (directoryFileDescripter < 0) { 
    NSLog(@"Couldn't obtain file descripter from the system."); 
    return; 
} 

dispatch_queue_t mainQueue = /*dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);*/dispatch_get_main_queue(); 
if (mainQueue == NULL) { 
    NSLog(@"Couldn't obtain mainQueue from the system."); 
    close(directoryFileDescripter); 
    return; 
} 

dispSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, directoryFileDescripter, DISPATCH_VNODE_WRITE | DISPATCH_VNODE_DELETE | DISPATCH_VNODE_RENAME, mainQueue); 
if (dispSource == NULL) { 
    NSLog(@"Couldn't obtain dispatch source for directory from the system."); 
    close(directoryFileDescripter); 
    return; 
} 


dispatch_source_set_event_handler(dispSource, ^{ 

    NSLog(@"directory notification received."); 
    int fileDes = dispatch_source_get_handle(dispSource); 
    unsigned long mask = dispatch_source_get_data(dispSource); 
    char path[PATH_MAX] = {0}; 
    int nRes = fcntl(fileDes, F_GETPATH, &path); 
    if (nRes < 0) { 
     return; 
    } 
if (mask & DISPATCH_VNODE_WRITE) { 
     NSLog(@"A file has been written."); 
    } 

if (mask & DISPATCH_VNODE_DELETE) { 
     NSLog(@"A file has been deleted."); 
} 

if (mask & DISPATCH_VNODE_RENAME) { 
     NSLog(@"A file has been renamed."); 
} 
}); 

dispatch_source_set_cancel_handler(dispSource, ^{ 
    close(directoryFileDescripter); 
}); 

dispatch_resume(dispSource); 

回答

1

您將正確的「爲什麼」。當創建的文件,重命名或刪除,該目錄被修改。你正在看的目錄,所以你得到一個「寫」事件。

我通常會通過重新掃描目錄來處理這個問題,每次它被標記爲已寫入時,並且自己注意到這些更改。如果您不擔心目錄本身正在移動或被刪除,那麼您可以只監視WRITE事件。

您當然也可以觀看每個文件的VNODE,但是我認爲這樣做對於解決這類問題會更​​加複雜。

+0

謝謝。我以爲是這樣...我只需要跟蹤所有的文件夾內容:( – CodeWeed