gpt4 book ai didi

c++ - FSEvents C++ 示例

转载 作者:可可西里 更新时间:2023-11-01 17:26:22 26 4
gpt4 key购买 nike

我需要为 Mac 中的文件夹创建 FSEvents 观察器。我对 C++ 很满意,有没有办法在 C++ 代码中获取 FSEvents 通知,而不是 Objective-C。是否有一些示例代码可以开始以及我需要包含的任何库..?

我已经在这个页面上了。 http://developer.apple.com/library/mac/#featuredarticles/FileSystemEvents/_index.html

但是好像只有Objective C,能不能有CPP版的

最佳答案

是的,在 C 中是可能的。您应该寻找内核队列。

下面是一个观看目录的小示例:

#include <errno.h>       // for errno
#include <fcntl.h> // for O_RDONLY
#include <stdio.h> // for fprintf()
#include <stdlib.h> // for EXIT_SUCCESS
#include <string.h> // for strerror()
#include <sys/event.h> // for kqueue() etc.
#include <unistd.h> // for close()

int main (int argc, const char *argv[])
{
int kq = kqueue ();
// dir name is in argv[1], NO checks for errors here
int dirfd = open (argv[1], O_RDONLY);

struct kevent direvent;
EV_SET (&direvent, dirfd, EVFILT_VNODE, EV_ADD | EV_CLEAR | EV_ENABLE,
NOTE_WRITE, 0, (void *)dirname);

kevent(kq, &direvent, 1, NULL, 0, NULL);

// Register interest in SIGINT with the queue. The user data
// is NULL, which is how we'll differentiate between
// a directory-modification event and a SIGINT-received event.
struct kevent sigevent;
EV_SET (&sigevent, SIGINT, EVFILT_SIGNAL, EV_ADD | EV_ENABLE, 0, 0, NULL);
// kqueue event handling happens after the legacy API, so make
// sure it doesn eat the signal before the kqueue can see it.
signal (SIGINT, SIG_IGN);

// Register the signal event.
kevent(kq, &sigevent, 1, NULL, 0, NULL);

while (1) {
// camp on kevent() until something interesting happens
struct kevent change;
if (kevent(kq, NULL, 0, &change, 1, NULL) == -1) { exit(1); }
// The signal event has NULL in the user data. Check for that first.
if (change.udata == NULL) {
break;
} else {
// udata is non-null, so it's the name of the directory
printf ("%s\n", (char*)change.udata);
}
}
close (kq);
return 0;
}

详细信息可以在 ch 中找到。 Mark Dalrymple 的“Advanced Mac OSX Programming”的 16(kqueues 和 FSEvents)。附加信息可以在 *BSD kqueues 文档中找到。

或者使用 FSEvents 中的这个 API(它主要是基于 C 的)。

FSEventStreamRef FSEventStreamCreate (CFAllocatorRef allocator,
FSEventStreamCallback callback,
FSEventStreamContext *context,
CFArrayRef pathsToWatch,
FSEventStreamEventId sinceWhen,
CFTimeInterval latency,
FSEventStreamCreateFlags flags);

使用纯 C 回调创建 FSEvents 事件流。

然后使用

将此事件流附加到您的运行循环
void FSEventStreamScheduleWithRunLoop (FSEventStreamRef streamRef,
CFRunLoopRef runLoop,
CFStringRef runLoopMode);

是的,在这里您可能应该使用一行 Obj-C 来获取 RunLoop 句柄:使用 -getCFRunLoop 从 NSRunLoop 获取 CFRunLoop

CFRunLoop* loopRef = [[NSRunLoop currentRunLoop] getCFRunLoop];

或者使用纯C调用

CFRunLoop* loopRef =  CFRunLoopGetCurrent();

开始事件流

Boolean FSEventStreamStart (FSEventStreamRef streamRef);

停止事件流

void FSEventStreamStop (FSEventStreamRef streamRef);

然后用这个从运行循环中取消调度:

void FSEventStreamUnscheduleFromRunLoop (FSEventStreamRef streamRef,
CFRunLoopRef runLoop,
CFStringRef runLoopMode);

使流无效(清理):

void FSEventStreamInvalidate (FSEventStreamRef streamRef);

希望这能帮助您入门。

关于c++ - FSEvents C++ 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556545/

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