3

我在 mac os x 上使用 Kqueues,我正在尝试监视一个文件夹,所以我使用了 EVFILT_VNODE 过滤器,我想在删除文件时收到通知,我试过NOTE_DELETE但它只检测文件何时被删除unlink() system call但不是当我将文件移动到垃圾箱时。

问题是如何检测文件何时被发送到垃圾箱?

4

1 回答 1

4

没有简单的方法可以做到这一点。kqueue()可以在文件被移动(又名重命名)时通知您,但它不会将垃圾视为任何类型的特殊目的地或对于文件的继续存在具有任何特殊意义。也就是说,就 BSD 层而言,将文件移动到垃圾箱就像将其移动到任何其他目录一样。

因此,您将监视NOTE_RENAME以找出文件何时移动/重命名。然后,您可以使用fcntl(fd, F_GETPATH, buffer)来找出新的路径。请注意,对于硬链接文件,这可能会给出其他链接之一的路径,而不是用户认为的项目路径。不过,这应该是相当罕见的。

然后,您必须查看新路径是否在垃圾箱内。这也很复杂。

如果您需要 OS X 10.10 或更高版本,您可以使用[[NSFileManager defaultManager] getRelationship:&relationship ofDirectory:NSTrashDirectory inDomain:0 toItemAtURL:[NSURL fileURLWithPath:pathFromFcntl] error:NULL]. 如果该方法返回 true 并设置relationship为 以外的任何值NSURLRelationshipOther,则该文件已被移至回收站。

如果您需要支持 10.9 及更早版本,则必须手动执行此操作:

不只是一个垃圾目录。每个卷上的每个用户都有一个不同的目录。要查找特定文件将使用的垃圾目录,请调用[[NSFileManager defaultManager] URLForDirectory:NSTrashDirectory inDomain:NSUserDomainMask appropriateForURL:[NSURL fileURLWithPath:pathFromFcntl] create:NO error:NULL].

然后您必须确定新路径是否在该目录中的某个位置(而不仅仅是在该目录中)。您需要迭代路径的目录。对于每个目录,使用-[NSURL getResourceValue:forKey:error:]withNSURLFileResourceIdentifierKey作为获取其资源标识符的键。为垃圾目录获取相同的值。使用 比较两者-isEqual:。如果您找到一个资源标识符等于垃圾目录的祖先目录,则该文件在垃圾中。如果祖先目录的迭代到达根目录而没有找到它,那么它不是。

于 2015-08-02T07:03:14.447 回答