在MacOS 10.10上监视文件系统事件

诺伯特

我正在尝试使用Xcode(在MacOS 10.10下)编写一个小的命令行工具,该工具监视特定的文件夹并通知我有关该文件夹中文件的更改。我正在遵循https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/FSEvents_ProgGuide/UsingtheFSEventsFramework/UsingtheFSEventsFramework.html中提供的指南

这是我当前的代码:

#import <Foundation/Foundation.h>
#include <CoreServices/CoreServices.h>



void mycallback(
                ConstFSEventStreamRef streamRef,
                void *clientCallBackInfo,
                size_t numEvents,
                void *eventPaths,
                const FSEventStreamEventFlags eventFlags[],
                const FSEventStreamEventId eventIds[])
{
    int i;
    char **paths = eventPaths;

    printf("Callback called\n");
    for (i=0; i<numEvents; i++) {
        int count;
        /* flags are unsigned long, IDs are uint64_t */
        printf("Change %llu in %s, flags %lu\n", eventIds[i], paths[i], eventFlags[i]);
    }
}


int main(int argc, const char * argv[]) {
    //  @autoreleasepool {
    // insert code here...
    NSLog(@"Starting to watch ");


    /* Define variables and create a CFArray object containing
     CFString objects containing paths to watch.
     */
    CFStringRef mypath = CFSTR("/Users/testuser/");
    CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL);
    void *callbackInfo = NULL; // could put stream-specific data here.
    FSEventStreamRef stream;
    CFAbsoluteTime latency = 3.0; /* Latency in seconds */

    /* Create the stream, passing in a callback */
    stream = FSEventStreamCreate(NULL,
                                 &mycallback,
                                 callbackInfo,
                                 pathsToWatch,
                                 kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
                                 latency,
                                 kFSEventStreamCreateFlagNone /* Flags explained in reference */
                                 );



    /* Create the stream before calling this. */
    FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);

    FSEventStreamStart(stream);

    CFRunLoopRun();

    return 0;
}

该代码可以编译并可以启动。但是,没有事件被触发。我是Xcode的新手,以前也从未使用过回调函数。所以我想这是我犯的一个非常愚蠢的错误。

我将不胜感激任何提示。

在此先感谢诺伯特

更新:使用答案中的有效解决方案更新了代码。

f

根据文档,在启动事件流发送事件之后,应调用CFRunLoopRun

尝试将while()循环更改为:

CFRunLoopRun();

更新我的输出:

$ ./fsevent
2015-05-17 13:51:29.718 fsevent[898:23601] Starting to watch
Callback called
Change 1165579 in /Users/baf/src/tests/, flags 66560
Callback called
Change 1165594 in /Users/baf/src/tests/, flags 66048

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法在 macOS 中运行 odoo 10

无法在MacOS 10上克隆Google Source Repository

在10.13.6 / Xcode 10上构建macOS暗模式应用

如何在macOS上远程访问Windows 10?

创建Windows 10在macOS Catalina上安装USB

无法在MacOS开始詹金斯 - Java的10

将网站设置为Win10(或MacOS)桌面

无法在macOS Mojave中安装Xcode 10 Network Link Conditioner

macOS 10.14(测试版)如何安装Command_Line_Tools_macOS_10.14_for_Xcode_10_Beta

带有OpenJDK 10和OpenJFX的MacOS X上的JavaFX中的HeadlessException

在Debian 10 Buster上在zsh中获得与MacOS相同的bash time命令格式

是否有等效于 macOS 的 Windows 10 受控文件夹访问 (CFA)?

在Win10上删除硬链接到系统文件

Nodejs代码无法在Windows10上构建,但可以在MacOS上运行。可能是什么原因?

新的Windows 10系统,在监视器之间移动程序

Clang 10无法在MacOS 10.12上将C ++应用程序与CMake链接

Windows10-Bootcamp无法找到macOS引导卷-未知的Mac分区

带USB开关的USB蓝牙适配器:从MacOS到Windows 10

macOS 10.12 和 iOS 10 - 遮挡了屏幕截图的某些部分?

初始化窗口后未绘制MacOS Mojave Xcode 10 + OpenGL

Xcode 10存档改为“其他项”,而不是“ MacOS应用程序”

如何在Xcode 10和macOS 10.14下启动WireMock for XCTest UI测试?

使用Clover(Windows 10,MacOS和Ubuntu)的三次启动Ubuntu

音频在VirtualBox Windows 10 guest虚拟机(macOS主机)上不起作用

<MacOS 上的 Docker> 容器可用的根文件系统空间的大小

如何在macOS上实现虚拟文件系统?

在MacOs上创建目录“ / dotenv”,只读文件系统

在Windows 10上创建系统映像失败

文件系统错误:Windows 10 Task Manager