2011-12-19 37 views
3

我是Cocoa應用程序開發新手。我希望我的應用程序在給定目錄下的任何文件被修改時(文件夾觀察者)得到通知。修改意味着刪除,添加,文件的內容被改變。我嘗試過使用FSEvents,使用NSWorkspace的通知中心或委託消息,如UKKQueue http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue。目錄下的任何文件被修改時,我的應用程序會收到通知但問題在於它沒有給出被修改的特定文件的名稱或路徑。它提供目錄的路徑,但不包含特定文件的路徑。如何在可可中獲取文件夾更改通知(文件夾查看器)

任何想法如何在特定文件中觀察文件夾以進行修改?

+0

的[遵守Objective-C的文件或文件夾(http://stackoverflow.com/questions/1386743/observe-a-file-可能重複或文件夾中的目標c) – 2011-12-20 02:51:57

+0

kqueues將監視單個文件中的更改,但您必須自行設置每個文件的監視。 「UKKQueue」對於這種開箱即用效果不佳,因爲它只允許一個代表。 – 2011-12-20 02:53:54

+0

有沒有其他方法可以根據我的要求觀看文件夾? – 2011-12-21 10:18:15

回答

6

您必須編寫代碼以跟蹤文件夾的內容,然後每當您收到FSEvent通知文件夾內容已更改時,您需要將存儲的有關文件夾內容的信息與實際當前內容進行比較。

這可能是一個像可變數組ivar這樣簡單的事,名爲folderContents,它包含一組文件屬性字典。您可以使用從-attributesOfItemAtPath:error:方法NSFileManager或其子集中返回的字典。

當您收到文件夾通知時,您需要做的所有事情都是遍歷存儲的字典,並檢查是否添加,刪除或修改了任何文件。屬性字典NSFileManager包含您需要執行此操作的所有信息。

然後您需要使用更新的信息更新您存儲的有關該文件夾的信息。

+0

你能否爲我提供示例代碼,因爲我告訴我是Cocoa Application開發的新手。 – 2011-12-22 12:01:26

5

NSMetadataQuery很適合看文件夾:

- (void)setupWatchedFolder { 
    NSString *watchedFolder = @"/path/to/foo"; 

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; 
    [query setSearchScopes:@[watchedFolder]]; 
    [query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*.*'", NSMetadataItemFSNameKey]]; 

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self selector:@selector(queryFoundStuff:) name:NSMetadataQueryDidFinishGatheringNotification object:query]; 
    [nc addObserver:self selector:@selector(queryFoundStuff:) name:NSMetadataQueryDidUpdateNotification object:query]; 

    [query startQuery]; 
} 

- (void)queryFoundStuff:(NSNotification *)notification { 

    NSMetadataQuery *query = self.metadataQuery; 
    [query disableUpdates]; 

    NSMutableArray *results = [NSMutableArray arrayWithCapacity:self.metadataQuery.resultCount]; 

    for (NSUInteger i=0; i<self.metadataQuery.resultCount; i++) { 
     [results addObject:[[self.metadataQuery resultAtIndex:i] valueForAttribute:NSMetadataItemPathKey]]; 
    } 

    // do something with you search results 
    // self.results = results; 

    [query enableUpdates]; 
} 
+0

這似乎是一個不錯的主意,但我無法讓它工作。 QueryFoundStuff從不被調用。 – 2014-01-21 03:06:58

+0

@MatthieuRiegler我已經更新了查詢謂詞以匹配我在我的應用中使用的內容 – mrwalker 2014-01-21 14:53:33

+1

是否可以使用NSMetadataQuery + NSNotificationCenter來獲取**只有**動作(文件被重命名,文件移動,文件添加)完整路徑名稱,無需遍歷整個觀察文件夾並映射到最後一個文件夾快照?我試圖實現一個DirectoryWatcher通知其他代碼部分何時文件被刪除或添加或重命名在一個監視文件夾內。我喜歡發送action + filePath。你能給我一個提示嗎?謝謝 – DoK 2016-01-15 16:40:33

相關問題