- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我刚刚设置了一个 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/
我正在查看有关 FSEvents 的苹果开发人员文档,但后来在 dropbox 论坛中,我发现了这个 https://forums.dropbox.com/topic.php?id=20771 , “
这是我得到的: $ sudo gem install autotest-fsevent Password: Building native extensions. This could take a
我正在尝试让 webpack 在 Visual Studio 中工作,但不断出现 Dependencies - not installed 问题。我在输出中收到此错误: npm WARN option
我正在使用 FSEvents 来监视将有一些大文件复制到其中的文件目录。目前 FSEvents 似乎在我开始复制文件时发出通知,并在完成复制文件时再次发出通知。但是,当它是一个较小的文件时,我只会得到
我正在安装 babel core 6.26.0 per this documentation ,一切顺利,除了出现以下错误: npm WARN optional Skipping failed opt
这简直要了我的命,我不确定我是否知道如何调试它。 我正在使用 Mac FSEvents API 来监视文件系统上的给定文件夹。但是,有时某些文件夹会停止发送任何通知事件。到目前为止,这种情况仅发生在
我正在尝试在我的沙盒应用程序中使用 FSEvents 来监视某些目录。我实现了以下类(class): @implementation SNTracker - (id)initWithPaths:(NS
我在 FSEvents 上看到奇怪的行为,我在恢复模式下安装我的驱动器并在重新启动时在我的流中获得零 fsevents。 我执行以下操作: 定时开机 使用 FSEventsGetCurrentEven
尝试使用 npm 等进行 react ,我经常收到这些类型的警告: > npm install axios redux react-redux redux-thunk react-router-dom
我正在尝试在 Gitlab CI 上构建我的 Angular 应用程序,并使用 npm ci 安装依赖项,但我遇到了错误 ' 无法从汇总中访问 fsevents '。我试过 npm ci --no-o
关于如何检测回调方法中文件夹中引发的文件夹事件(FSEvent)的类型(下面代码中的gotEvent方法)有什么想法吗?例如:文件已重命名、文件已创建?我只想对“文件重命名”、“文件创建”进行一些操作
我正在使用 FSEvents API 来获取我正在跟踪的本地目录中的更改通知。 是否可以使用 FSEvents 或其他任何方式获取监视目录已移动到磁盘上其他位置的通知? 更新: 这是我到目前为止的代码
在 OS X 上,使用 FSEvents API,我可以轻松获取感兴趣的路径的文件和目录通知(创建、删除等)。但是,我想知道是否有任何方法可以获得执行操作的进程的 PID 或名称(例如,创建文件)。我
我正在尝试为我的程序编写测试用例,并且我听到了有关 testing-library/react 和 jest-junit 的好消息。我使用 npm 将这两个包安装到我的 devDependency 中
我需要为 Mac 中的文件夹创建 FSEvents 观察器。我对 C++ 很满意,有没有办法在 C++ 代码中获取 FSEvents 通知,而不是 Objective-C。是否有一些示例代码可以开始以
我刚刚设置了一个 FSEvent 以监视目标文件夹的状态。它工作得很好,因为每次发生更改时我都会收到通知,并且还会提供到发生更改的子目录的路径。但是,如果我想了解执行的操作是什么怎么办?是否添加、修改
最近将 OSX Lion 上的 Ruby 从 1.8.7 更新到 1.9.3。在此过程中,我丢失了安装在 1.8.7 上的 Ruby Gems,因此尝试重新安装它们。 遇到了 rb-fsevent G
我正在尝试使用 npx create-react-app first-react-app 创建 React 应用程序. 当它开始创建应用程序时,我每次都会收到以下警告。最后是创建一个应用程序。但原因是
什么时候国旗kFSEventStreamEventFlagItemInodeMetaMod被设置?在 Apple's developer documentation它说值(value)是: kFSEv
我已经使用 fsevents 设置了一个观察器机制。其要点是每次在文件夹 X 中创建文件时,我都希望运行一个函数。它现在运行良好,但我需要能够更改它正在监视的路径。这是设置代码: void *appP
我是一名优秀的程序员,十分优秀!