如何使用Kqueue检测文件何时发送到垃圾箱?

时间:2015-08-01 22:17:48

标签: macos cocoa kqueue

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

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

1 个答案:

答案 0 :(得分: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:]NSURLFileResourceIdentifierKey作为获取其资源标识符的密钥。获取垃圾邮件目录的相同值。使用-isEqual:比较两者。如果找到其资源标识符等于垃圾目录的祖先目录,则该文件位于废纸篓中。如果祖先目录的迭代到达root而没有找到,那么它就不是。