小编Cit*_*ron的帖子

使用Lion上的FSEvents跟踪文件重命名/删除

我正在尝试使用FSEvents来检测何时从特定文件夹添加/删除文件.目前,我在FSEvents周围实现了一个简单的包装器,它工作正常:我得到了所有的事件.

但我现在遇到的问题是,当我在Finder中重命名文件时,我捕获了2个不同的事件:第一个类型是"重命名"旧文件名,另一个是"重命名"和新文件名.两个调用之间的事件ID都不同.

那么,我怎么知道哪个"重命名"事件包含旧名称,哪个事件包含旧名称?我试着查看文档,但不幸的是,kFSEventStreamEventFlagItemRenamed没有记录......它在Lion中似乎是新的.

PS:我能想到的唯一方法是:在重命名的事件上,我检查我的UI,看看我是否有一个与事件路径对应的项目.如果是这样,我将其标记为重命名.如果没有,我检查项目是否被标记为重命名,如果是,则将其重命名为新的事件路径.但我真的不喜欢这个想法......

编辑:好的,我在我的"PS"行中发现了一些内容:我注意到在重命名时,2个事件的id是连续的,所以使用包含新名称的事件的id,我可以得到事件包含旧名称.在"重命名"事件的情况下,我只是在界面中使用一个小字典来存储id和相关路径.

无论如何,我现在可以捕获重命名事件,甚至移动事件:当你移动文件时,它是一个"重命名"的事件,它被FSEventStream捕获...

但是,我还有最后一个问题:删除.当我删除某些内容时,它会被移动到回收站:我收到一个"重命名"的事件.但问题是我没有收到第二次重命名事件.仅.DS_Store文件上的"已修改"事件.我认为Finder使用此文件来了解bin中的文件等等.因此,我可以检查对此文件的修改,并获取最后一次"重命名"事件以检测文件是否已发送到bin.但是我使用的是使用Asepsis的TotalFinder,它修改了Finder存储的方式.DS_Store文件:我不再收到"修改"了.要sumarize:我无法检测何时将文件发送到bin ...

知道我怎么能这样做吗?也许使用除FSEvents以外的其他东西来捕捉这个事件?

objective-c fsevents osx-lion

13
推荐指数
2
解决办法
4059
查看次数

Cocoa,FSEvents,kFSEventStreamCreateFlagFileEvents标志和"重命名"事件

我一直在玩我的FSEvents一个小应用程序来同步我的应用程序的内容与硬盘驱动器上的内容(基本上,它是一个小图像查看器,我希望其内容在硬盘内容更改时更新)

我使用kFSEventStreamCreateFlagFileEvents标志创建了我的流,但我很难弄清楚这些事件是如何由操作系统(或内核,或其他)生成的.不幸的是,没有关于使用此标志生成的事件的文档...他们似乎是10.7的新手,但仍未记录.

所以,我的主要问题是"重命名".当我正在进行简单的重命名时,会向我的回调发送2个kFSEventStreamEventFlagItemRenamed事件.一个包含旧文件名,第二个包含新文件名.重命名一批文件时会出现问题,这些事件可能不是顺序的.例如,它有以下情况:

  1. "file1" - >"new_file_1"
  2. "file2" - >"new_file_2"

我可能会按此顺序收到事件:

  1. "重命名"/"file1"
  2. "重命名"/"file2"
  3. "重命名"/"new_file_1"
  4. "重命名"/"new_file_2"

当你遇到第二个重命名事件时似乎没有任何方法可以获得第一个重命名事件的ID ...所以我做的是:当接收"重命名"事件时,我做一个stat()与文件名.如果stat成功返回,则表示它是新文件名.如果没有,这意味着它是旧的.我仍然没有办法链接这两个事件,但至少我可以通过删除旧文件并添加新文件来解决.

所以,我基本上有两个问题:

首先是:我完全失明了,没有看到通过fsevents正确捕捉"重命名"事件的明显方法吗?

第二个我:我有时会有一个奇怪的错误,而不是只有2个重命名的事件,3个被发送!所以我得到一个文件添加两次...我不确定这是不是一个错误,或者如果这是因为我完全错过了使用kFSEventStreamCreateFlagFileEvents标志的fsevent API ...

欢迎任何帮助,我完全没有想法来解决这个问题!

cocoa fsevents

7
推荐指数
1
解决办法
1776
查看次数

标签 统计

fsevents ×2

cocoa ×1

objective-c ×1

osx-lion ×1