尝试访问不可读的URL时,FileManager.default.enumerator会导致崩溃

时间:2016-10-27 13:35:55

标签: swift macos cocoa

从表面上看,在创建目录枚举器时似乎应该注意,但我的代码采用用户选择的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..,但这似乎是一次双重检查,这不应该是必要的。

我的代码是错误还是错误?

0 个答案:

没有答案