从表面上看,在创建目录枚举器时似乎应该注意,但我的代码采用用户选择的URL,并且可以在NSOpenPanel中选择受保护的文件夹,然后传入以创建目录枚举。例如,用户可以选择非访客用户无法读取的User/Guest/Desktop
文件夹。
我的处理代码(一旦选择了url [s])是:
if let enumerator: FileManager.DirectoryEnumerator = FileManager.default.enumerator(at: the_url, includingPropertiesForKeys: [URLResourceKey.isReadableKey], options: [.skipsHiddenFiles, .skipsPackageDescendants], errorHandler: { (unreadable_url, error) -> Bool in
print ("Enum error")
DispatchQueue.main.sync(execute: { () -> Void in
self.setStatusText("Cant read url", colour: .red) //Code to update UI on main thread
error_occured = true
})
return false
}) {
//process contents
while let nested_item = enumerator.nextObject() { //....<Crashes
// ..
}
}
如果网址不可读(通常是因为它受到保护),那么应用程序会在while..
行以错误崩溃。
主题6:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)
Xcode控制台中没有其他信息输出。似乎enumerator
ivar通过了非零测试,尽管它不可用并且没有执行错误块,因此while
语句失败。
我的解决方案是检查URLResourceKey.isReadableKey
行之前的if let..
,但这似乎是一次双重检查,这不应该是必要的。
我的代码是错误还是错误?