如何检测带安全范围的URL书签数据是否指向垃圾箱?
检测安全范围书签是否指向垃圾箱的简便方法
嘿,这个场景我之前碰过,其实不用自己去对比原始URL或者硬查路径里的.Trash,系统本身就提供了更靠谱的方式,分两步走就行:
1. 先判断书签是否已"过期"(文件位置变更)
当你解析安全范围书签的时候,URL(resolvingBookmarkData:options:relativeTo:bookmarkDataIsStale:)这个方法里的bookmarkDataIsStale指针参数会帮你大忙——如果文件被移到垃圾箱,书签的指向发生了变化,这个参数会被设为true,这是第一个信号。
2. 用系统原生API判断URL是否在垃圾箱
拿到更新后的URL之后,直接通过URL的资源值(resource values)获取isInTrashKey属性,这是Foundation专门用来检测文件是否处于垃圾箱的键,比自己拼路径判断靠谱太多(毕竟不同用户、不同磁盘的垃圾箱路径可能不一样,比如外接磁盘的垃圾箱是.Trashes/用户ID,自定义改名的垃圾箱也会让路径判断失效)。
给你个Swift的代码示例,直接能用:
func checkIfBookmarkPointsToTrash(bookmarkData: Data) -> Bool { var isBookmarkStale = false // 解析书签,记得启用安全范围 guard let resolvedURL = URL(resolvingBookmarkData: bookmarkData, options: .withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isBookmarkStale) else { // 书签解析失败,直接返回false return false } // 如果书签没过期,说明文件位置没动,肯定不在垃圾箱 guard isBookmarkStale else { return false } // 获取文件是否在垃圾箱的属性 do { let resourceValues = try resolvedURL.resourceValues(forKeys: [.isInTrashKey]) return resourceValues.isInTrash ?? false } catch { print("获取文件属性出错: \(error.localizedDescription)") return false } }
额外提醒
isInTrashKey从macOS 10.11和iOS 9.0就开始支持了,兼容性基本覆盖所有现代系统。- 解析书签时一定要带上
.withSecurityScope选项,不然可能没有权限访问垃圾箱内的文件属性。 - 相比存原始URL对比,这个方法不需要额外存储原始路径,也不会因为用户重命名文件、移动到其他位置再移回(非垃圾箱)而误判,逻辑更清晰准确。
内容的提问来源于stack exchange,提问作者bauerMusic
相关产品推荐
相关产品推荐

