- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 FSEvents API 来获取我正在跟踪的本地目录中的更改通知。
是否可以使用 FSEvents 或其他任何方式获取监视目录已移动到磁盘上其他位置的通知?
更新:
这是我到目前为止的代码,我现在尝试将 kFSEventStreamCreateFlagWatchRoot 标志与 FSEventStreamCreate 一起使用来获取根更改通知,但到目前为止还没有成功。
- (void)registerForFileSystemNotifications {
NSString *watchedDirectoryPath = [[NSUserDefaults standardUserDefaults] valueForKey:kMyWatchedDirectoryPathKey];
self.watchedDirectoryFileDescriptor = open([watchedDirectoryPath cStringUsingEncoding:NSUTF8StringEncoding], O_RDONLY);
NSArray *paths = [NSArray arrayWithObject:watchedDirectoryPath];
void *appController = (void *)self;
FSEventStreamContext context = {0, appController, NULL, NULL, NULL};
FSEventStreamRef streamRef = FSEventStreamCreate(NULL,
&fsevents_callback,
&context,
(CFArrayRef) paths,
kFSEventStreamEventIdSinceNow,
(CFTimeInterval)2.0,
kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagWatchRoot);
FSEventStreamScheduleWithRunLoop(streamRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
FSEventStreamStart(streamRef);
}
void fsevents_callback(ConstFSEventStreamRef streamRef,
void *userData,
size_t numumberOfEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[]) {
MyAppController *appController = (MyAppController *)userData;
char *newPath = calloc(4096, sizeof(char));
int pathIntPointer = (int)newPath;
int length = fcntl(appController.watchedDirectoryFileDescriptor, F_GETPATH, pathIntPointer);
NSString *newPathString = [[NSString alloc] initWithBytes:newPath length:(NSUInteger)length encoding:NSUTF8StringEncoding];
NSLog(@"newPathString: %@", newPathString); // empty
}
最佳答案
是的。将 kFSEventStreamCreateFlagWatchRoot
作为最后一个参数传递给 FSEventStreamCreate
,如果目录被移动或重命名,您将会收到通知。来自 docs :
Request notifications of changes along the path to the path(s) you're watching. For example, with this flag, if you watch "/foo/bar" and it is renamed to "/foo/bar.old", you would receive a RootChanged event. The same is true if the directory "/foo" were renamed. The event you receive is a special event: the path for the event is the original path you specified, the flag kFSEventStreamEventFlagRootChanged is set and event ID is zero. RootChanged events are useful to indicate that you should rescan a particular hierarchy because it changed completely (as opposed to the things inside of it changing). If you want to track the current location of a directory, it is best to open the directory before creating the stream so that you have a file descriptor for it and can issue an F_GETPATH fcntl() to find the current path.
编辑:添加 fcntl 示例
cocoadev 的例子表明作者对指针有点缺乏经验。 pathIntPointer 不仅是不必要的,而且也是导致问题的原因。对 fnctl 返回代码的错误检查会捕获它。这是回调的修订版本:
void fsevents_callback(ConstFSEventStreamRef streamRef,
void *userData,
size_t numumberOfEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[]) {
MyAppController *appController = (MyAppController *)userData;
char newPath[ MAXPATHLEN ];
int rc;
rc = fcntl( appController.watchedDirectoryFileDescriptor, F_GETPATH, newPath );
if ( rc == -1 ) {
perror( "fnctl F_GETPATH" );
return;
}
NSString *newPathString = [[NSString alloc] initWithUTF8String: newPath ];
NSLog(@"newPathString: %@", newPathString);
[ newPathString release ];
}
关于cocoa - 是否可以使用 FSEvents 获取文件夹已移动的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5799003/
我正在查看有关 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
我是一名优秀的程序员,十分优秀!