gpt4 book ai didi

objective-c - FSEvents - 找出目标目录中发生了什么变化

转载 作者:搜寻专家 更新时间:2023-10-30 20:10:02 24 4
gpt4 key购买 nike

我刚刚设置了一个 FSEvent 以监视目标文件夹的状态。它工作得很好,因为每次发生更改时我都会收到通知,并且还会提供到发生更改的子目录的路径。但是,如果我想了解执行的操作是什么怎么办?是否添加、修改、重命名或删除了文件?

在 Mac Developer Library 中,我通过使用持久事件阅读了它

"you can find out what files have been modified even when your application is not running. This can greatly simplify tasks such as backing up modified files, checking for changed dependencies in multi-file projects, and so on."

但如果我理解得很好,这只是一种将目录的当前状态与事件 ID 定义的先前状态进行比较的方法。因此,我再次只能获取发生更改的子目录的路径。

我的问题是:我真的必须通过创建 Directory Hierarchy Snapshots 在不同时间“手动”拍摄我的目录状态的快照,然后比较它们以找出什么是在快照之间的时间执行的操作?有没有更快的方法?

最佳答案

我做了以下操作,以便能够区分正在使用 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 对象数组。

要了解执行了什么操作,现在只需面对回调之前(保存在 NSMutableArray *oldSnap 中)和回调之后(保存在 NSMutableArray *newSnap 中)收集的信息就足够了) 的 FSEvent。首先需要将 oldSnap 中的文件与 newSnap 中的文件进行比较,然后反之亦然。

如果在 oldSnap 中有一个给定名称的文件在 newSnap 中丢失,则意味着该文件已被删除或重命名。如果 newSnap 中有一个文件具有相同的哈希值,则该文件已重命名;否则它已从文件夹中删除。

完成比较,如果 newSnap 中的文件与 oldSnap 中的同名文件具有不同的 fileModificationDate,该文件已被修改。如果 newSnap 中有一个文件在 oldSnap 中丢失,则此文件是新添加的。

关于文件的重命名和修改,我还没有想出一个解决方案。希望这个答案可以帮助其他人!

关于objective-c - FSEvents - 找出目标目录中发生了什么变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14376345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com