问题标签 [fsevents]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
525 浏览

cocoa - 在沙盒应用中使用 FSEvents

我正在尝试在我的沙盒应用程序中使用 FSEvents 来监视某些目录。我实现了以下类:

问题是“asd”永远不会被打印(即回调函数永远不会被调用)。当我在 Xcode 的主要目标摘要中禁用“启用应用程序沙盒”时,会调用回调。难道我做错了什么?我授予沙盒应用程序的唯一权利是对用户选择的文件的读写访问权限。

0 投票
1 回答
506 浏览

objective-c - fsevents 命令行

我编写了一个objective-c 类,用于使用FSEventStreamCreate() 观看特定文件夹。当我在基于 GUI 的应用程序中使用它时,该类按预期工作。

现在我正在尝试使用此类编写命令行应用程序。该项目无法链接:(

以下是错误信息

架构 x86_64 的未定义符号:
“_FSEventStreamCreate”,引用自:
-[MyFSWatcher initializeEventStream] in MyFSWatcher.o
“_FSEventStreamScheduleWithRunLoop”,引用自:
-[MyFSWatcher initializeEventStream] in MyFSWatcher.o
“_FSEventStreamStart”,引用自:
-[MyFSWatcher initializeEventStream]在 MyFSWatcher.old 中
:未找到架构 x86_64 的符号
clang:错误:链接器命令失败,退出代码为 1

我猜我缺少一些链接器标志。有人可以指出吗?

0 投票
1 回答
593 浏览

objective-c - NSRunLoop 在任何 FSEvent 或计时器触发之前提前返回

我正在尝试使用 NSRunLoop 来监视代理应用程序中的 FSEvents(即,没有任何 GUI)。我我了解 RunLoop 的工作原理,但我显然不了解,因为我看到的行为是难以理解的。我错过了什么?(我对几种语言的线程编程很满意,但是 Objective-C 对我来说有点新奇)。

下面复制的是一个 EventHandler类的(接近我能得到的)最小实现。这是通过分配和初始化一个实例从主函数调用的,然后使用 发送该 startWatching消息"/tmp/fussybot-test",然后使用 finally发送该消息tidyUp

下面的实现代码创建、调度和启动附加到默认 RunLoop 的事件流,然后循环,等待runMode:beforeDate 任何 FSEvents 或 RunLoop 的计时器到期。

好的,所以我们构建它,开始它,然后触摸监视目录中的一个文件:

然后我们取消注释该行NSLog(@"waiting until %@", waitEnd);XXX上面标有),我们再试一次:

现在这里有件非常奇怪的事情。

  • 首先,添加NSLog调用会改变程序的行为。诶?!
  • 其次,在这两个示例中,RunLoop 似乎立即退出,而无需等待 FSEvent。

关于第一个,NSLog有这样的效果的事实肯定告诉我一些非常重要的事情,但我一生无法弄清楚什么。

关于第二种情况,在每种pathsSeen=0情况下, runMode:beforeDateRunLoop 对象上的消息都不会阻塞,而是返回YES,尽管该消息的文档说它YES仅返回“如果运行循环运行并处理了输入源,或者如果指定的已达到超时值”,在上述情况下都不是真的pathsSeen=0。在每种情况下,我都希望在该pathsSeen=0行出现之前看到 5 秒的延迟,因为没有看到任何 FSEvent 的 RunLoop 会阻塞到waitEnd间隔的末尾。

这两个特点都表明我误解了一些非常基本的东西,大概是关于对象生命周期的。我想我可以陈述以下每一项:

  • 我确实应该调用NSRunLoop runMode:beforeDate程序的主线程(程序在等待时没有其他事情可做,所以被阻塞是完全正确的事情)。这与Threading Programming Guide中对 RunLoops 的解释兼容。
  • 每个线程只有一个 RunLoop,所以我event_stream等待的 RunLoop 上进行调度 。
  • 根据创建规则,我拥有event_stream,因此不会在我背后收回。
  • waitEnd每次循环都会不同 - 即,它不会在每次循环中保留。
  • createStream:runLoop初始化实例变量 pathsToWatch意味着我不必担心在使用此参数创建流后它会FSEventStreamCreate消失。如果这是一个局部变量,ARC 管理将在方法结束时回收它,但不是,因为它是一个实例变量。
  • 没有其他事件会导致 RunLoop 解除阻塞。即使操作系统确实在这个 RunLoop 上安排了一些东西(文档似乎仔细地不排除这种情况),我也会在回调中看到这样的事件。
  • 第一种情况下的FSEventStreamEventFlagson 事件是预期的——没有任何迹象表明任何事件已因某种原因被丢弃。

也就是说,我似乎已经证明这是行不通的。它显然不起作用,所以......我灾难性地未能得到什么?(当我得到它时,砰的一声,它会受伤吗?)。

FSEvent API 是否代表“基于端口的输入源”,根据线程编程指南中的“事件的运行循环序列” ?如果是这样,那么肯定应该在该序列的第 7 步中接收到 FSEvent。

上面的代码非常基于文件系统事件 API 文档中的示例代码。我认为我的理解与这个深思熟虑的答案中的解释兼容,但我一直无法找到许多其他相关的 RunLoop 问题。SO 系统建议的问题主要与专门添加 NSTimers 而不是使用 RunLoop 调用的内置计时器有关。 这个关于 FSEvent 和 Dropbox的问题看起来很可能,但是 (a) 没有答案,并且 (b) 可能是与 Dropbox 的交互。

这是

在 OS X 10.8.3 上。

(这是一个很长的问题:对不起。通常当你问这么长的问题时,你已经自己想出了答案,但是——不—​​—我现在和以前一样困惑。)

0 投票
1 回答
1804 浏览

c++ - 不使用 Inotify 从 Linux 内核读取文件系统事件

在 Linux 中读取文件系统事件,我们大多数人使用 Inotify,这确实是一个很好的方法。但它有它的局限性。我必须跟踪我必须观察的所有目录,并为每个目录获取一个 inotify 描述符。假设我想监控我的整个系统,它有大约 1000 万个目录。为 inotify API 本身列出和排队它们需要几个小时。它也会吃掉很多内存。而且我当然不能观看超过 /etc/syscntl.conf 或 /proc/sys/fs/inotify/max_user_watches 中 max_user_watches 中指定的目录。

但是我们知道每个文件系统事件都由内核监控,我们使用 inotify API 来注册特定的目录修改。但是我如何在没有 API 的情况下直接从内核读取 fs 事件 ..?[在 Mac OS X 中,我可以从 /dev/fsevents 读取,同样如果我可以从 /proc 或类似的东西读取,那就太好了]。我也准备好编写一个内核模块,但请分享一些关于此的信息。

0 投票
1 回答
792 浏览

macos - FSEvent 标志 kFSEventStreamEventFlagItemInodeMetaMod 是什么意思?

什么时候设置国旗kFSEventStreamEventFlagItemInodeMetaMod?在Apple 的开发人员文档中,它说该值是:

但它没有解释何时设置。

谢谢!

0 投票
0 回答
600 浏览

cocoa - (Cocoa) 使用文件系统事件 API 监控文件更改

我有一个任务需要在将图像复制到文件夹时得到通知。我从以下位置找到了一个示例:http: //developer.apple.com/library/mac/#featuredarticles/FileSystemEvents/_index.html

它在使用命令时起作用:

当我将图像复制并粘贴或在文件夹中拖动新图像时,它不起作用。fsevents_callback 做出反应,表示文件夹已更改。但是我怎么知道有一个新图像复制到文件夹或文件夹中更改了图像?

0 投票
1 回答
306 浏览

macos - 未通过 FSEvents 检测到 sftp 文件修改

在 OSX 10.8.x 上,我使用 FSEvents 来检测目录中的更改。问题是当通过 sftp 复制文件时,不会调用 FSEvents 回调。
当我cp用来复制文件(或touch模拟更改)时,会调用回调。我在做傻事吗?sshd 是否使用某种低级 API 来创建文件?我应该向 Apple 提交错误吗?

我在 sshd 配置中使用 internal-sftp:

0 投票
0 回答
279 浏览

python - 回调不被称为 Python

我正在编写一个应用程序,它必须能够监视文件系统目录以了解 python 中的更改,为此我使用 MacFSEvents,这是 FSEvents C API 上的 python 包装器,出于明显的效率原因,轮询不能成为一种选择由于此代码可以负责递归地监视大量文件,因此该模块确实可以工作,并且这样的代码会产生预期的结果

但是,当我将它放入应该管理(相对)低级文件系统详细信息的类中时,不会调用回调,在下面您可以找到不起作用的代码

这是应该触发事件/回调的代码(单元测试的一部分)

希望你们能提示我正确的方向,因为我对python有点新手,所以我很坚持

0 投票
0 回答
240 浏览

objective-c - FSEvents回调函数事件标志麻烦

我有一个FSEvents流,我观察一个文件夹。当我将一些文件添加到该文件夹​​时,回调函数会触发它。但是,我认为我可以使用FSEventStreamEventFlags常量检查特定事件,例如将文件添加到我的文件夹,或者检查文件是否被修改,但我不能。我只能在完成历史的情况下做到这一点:

我检查了所有其他FSEventStreamEventFlags常量,没有常量会触发将文件添加到我的文件夹或修改文件或删除。我现在使用这种结构:

但是当我使用这种结构时,当我添加文件或其他内容时,我会收到一个多重回调(即我有一个多重 NSLog 消息“文件夹中的某些活动”)。为什么?我怎样才能只得到一个回调?

0 投票
1 回答
2448 浏览

c - OSX FSEventStreamEventFlags 无法正常工作

我正在查看文件系统事件的目录。除了一个例外,一切似乎都运行良好。当我第一次创建文件时,它会吐出它已创建。然后我可以删除它,它说它已被删除。当我再次创建同一个文件时,我同时得到一个创建和删除标志。我显然误解了在调用回调时如何设置标志。这里发生了什么?