2013-01-17 32 views
3

我只是設置了一個FSEvent以監視目標文件夾的狀態。它工作得很好,因爲每次發生更改時都會收到通知,並且我還會獲取發生更改的子目錄的路徑。 但是,如果我想要了解執行的操作是什麼?文件是否被添加,修改,重命名或刪除?FSEvents - 找出目標目錄中發生了什麼變化

在Mac開發人員庫我讀通過持久的事件

「你可以找出哪些文件已被修改,甚至當你的應用程序沒有運行,這可以極大地簡化任務,如備份修改後的文件,檢查多文件項目中已更改的依賴關係等。「

但是,如果我理解的很好,這只是一種比較目錄的狀態和事件ID定義的前一個狀態的方法。所以我再次只能得到發生變化的子目錄的路徑。

我的問題是:是否真的必須在不同的時間手動拍攝我的目錄狀態快照,方法是創建Directory Hierarchy Snapshots並稍後進行比較,以瞭解快照之間執行的操作?沒有更快的方法嗎?

回答

2

我做了以下的事情,以便能夠區分FSEvent(文件添加,文件重命名,文件刪除和文件修改)正在觀看的文件夾內的文件的不同操作。

我創建了一個對象File具有以下屬性(您可以通過調用attributesOfItemAtPath:error:得到你想要儘可能多):

@property (strong) NSString *name; 
@property (strong) NSString *type; 
@property (strong) NSDate *creationDate; 
@property (strong) NSDate *modificationDate; 
@property (strong) NSString *hash; 
@property (strong) NSString *path; 

它可以填充File對象的NSMutableArray以下列方式:

NSMutableArray *files = [[NSMutableArray alloc] init]; 
NSString *dirPath = //directory you are watching 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSArray *theFiles = [fileManager contentsOfDirectoryAtURL:[NSURL fileURLWithPath:dirPath] 
           includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey] 
                options:NSDirectoryEnumerationSkipsHiddenFiles 
                error:nil]; 
NSArray* fileNames = [theFiles valueForKeyPath:@"lastPathComponent"]; 
if ([fileNames count] > 0) { 
    for (NSInteger i=0; i<[fileNames count]; i=i+1) { 
     NSString *currentPath = [dirPath stringByAppendingString:[fileNames objectAtIndex:i]]; 
     NSError *error; 
     NSDictionary *fileInfo = [fileManager attributesOfItemAtPath:currentPath error:&error]; 
     File *currentFile = [[File alloc] initWithName:[fileNames objectAtIndex:i] 
                withType:fileInfo.fileType 
                withPath:currentPath 
                withHash: //get file hash 
              withCreationDate:fileInfo.fileCreationDate 
            andWithModificationDate:fileInfo.fileModificationDate]; 
     [files addObject:currentFile]; 
} 

如果該目錄包含子文件夾,則對每個子文件夾,返回和File對象數組迭代該過程就足夠了。

要了解執行了哪些操作,現在就足以應對FSEvent之前收集的信息(保存在NSMutableArray *oldSnap中)和回調(保存在NSMutableArray *newSnap之後)。首先需要將oldSnap中的文件與newSnap中的文件對照,然後反之亦然。

如果在oldSnap中有一個給定名稱的文件,在newSnap中缺少,則表示該文件已被刪除或重命名。如果在newSnap中存在具有相同散列的文件,則該文件已被重命名;否則它已從文件夾中刪除。

完成比較後,如果newSnap中的文件與oldSnap中的fileModificationDate中的文件名相同,則該文件已被修改。如果在oldSnap中缺少newSnap中的文件,則此文件是新添加的文件。

我還沒有想出一個解決方案,重新命名和修改文件。希望這個答案可以幫助別人!

相關問題