gpt4 book ai didi

cocoa - FSEventStream - 过滤从我自己的应用程序生成的事件

转载 作者:行者123 更新时间:2023-12-03 16:15:36 27 4
gpt4 key购买 nike

我正在编写一个应用程序,将数据保存到特定文件夹内的一组文本文件中。当其他应用程序(例如 Dropbox 或 TextEdit)更改文件时,我有一个 FSEventStream 会收到通知,这样我就可以使用提供的新文本内容更新我的应用程序。

问题是,对于我的 FSEventStream - 尽管我设置了 kFSEventStreamCreateFlagIgnoreSelf 标志 - 即使在我自己的应用程序中修改文件时我也会收到通知.

这带来了很多复杂性,因为在我保存文件并收到文件更改通知后,我必须重新检查文件。我们可以在这里讨论优化,但是根据我的数据结构,这是很多不必要的操作和磁盘使用。

问题是:如何将 a) 来自其他应用程序的文件事件与 b) 我自己的应用程序生成的文件事件分开?

我认为可能有一种方法可以通过 FSEventID 获取 processID(后者在回调函数中提供)。但没有找到任何相关内容。看起来提供 EventID 只是为了定义 FileEvents 链中的顺序。

我想要的是忽略自行生成的文件系统事件。

这是我用来设置 FSEventStream 的代码:

NSArray * pathArray = [NSArray arrayWithObject:_pathToObserve];

FSEventStreamContext context;
context.info = self;
context.version = 0;
context.retain = NULL;
context.release = NULL;
context.copyDescription = NULL;

_fsEventStream = FSEventStreamCreate(NULL,
filesystemObserverCallback,
&context,
(CFArrayRef)pathArray,
kFSEventStreamEventIdSinceNow,
1.0,
kFSEventStreamCreateFlagIgnoreSelf|kFSEventStreamCreateFlagFileEvents|kFSEventStreamCreateFlagUseCFTypes);

FSEventStreamScheduleWithRunLoop(_fsEventStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
FSEventStreamStart(_fsEventStream);

以及回调函数:

void filesystemObserverCallback(ConstFSEventStreamRef streamRef,
void * clientCallBackInfo,
size_t numEvents,
void * eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{

NSArray * pathArray = (NSArray *)eventPaths;

for (int i=0; i < numEvents; i++)
{
NSString * path = [pathArray objectAtIndex:i];
FSEventStreamEventFlags flags = flagsArray[i];

if (flags & kFSEventStreamEventFlagItemCreated ||
flags & kFSEventStreamEventFlagItemRemoved ||
flags & kFSEventStreamEventFlagItemRenamed ||
flags & kFSEventStreamEventFlagItemFinderInfoMod ||
flags & kFSEventStreamEventFlagItemChangeOwner ||
flags & kFSEventStreamEventFlagItemXattrMod)
{

NSLog(@">> item has changed at path: %@", path);
}
}
}

最佳答案

除了 kFSEventStreamCreateFlagIgnoreSelf 之外,尝试将 kFSEventStreamCreateFlagMarkSelf 设置为 FSEventStreamCreate 的标志。这对我有用。

我猜,这会触发生成“自己的”标志,因此可以忽略它。如果这也适合您,请告诉我们。

关于cocoa - FSEventStream - 过滤从我自己的应用程序生成的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22981497/

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