我做了以下的事情,以便能夠區分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中的文件,則此文件是新添加的文件。
我還沒有想出一個解決方案,重新命名和修改文件。希望這個答案可以幫助別人!