iOS 文档文件夹不是目录 and/or 丢失
iOS Document folder is not a directory and/or is missing
正在尝试归档 Codable
个元素的数组。
do {
let data = try PropertyListEncoder().encode(elements)
let success = NSKeyedArchiver.archiveRootObject(data, toFile:self.archiveURL.path)
print(success ? "Successful save" : "Save Failed")
} catch {
print("Save Failed")
}
由于某种原因,路径 (archiveURL
) 经常出错:
let archiveURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
总是像这样返回 URL:
file:///Users/userName/Library/Developer/CoreSimulator/Devices/deviceID/data/Documents
但搜索文件夹时我没有看到 /Documents 文件夹。最近有什么变化吗?几周前它曾经工作过(很确定)。超级烦人,我找不到任何 workaround/fix。
我相信这是 iOS 模拟器的(新式)"feature" - 最初安装应用程序时,并非所有常用目录都存在。
幸运的是,创建它们很容易,例如对于 applicationSupport 目录,我在我的应用程序中这样做:
let fileManager = FileManager.default
let directory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first!
if !fileManager.fileExists(atPath: directory) {
try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil)
}
您不能(覆盖)写入 Documents
目录,您必须附加一个文件名。
为什么要存档数据?您可以将 属性 列表数据直接写入磁盘。
并且never ever在catch
子句中打印无意义的文字字符串,至少打印实际错误。
let fileName = "myPropertyList.plist"
let fileURL = archiveURL.appendingPathComponent(fileName)
do {
let data = try PropertyListEncoder().encode(elements)
try data.write(to: fileURL)
} catch {
print("Save Failed", error)
}
这发生在模拟器 运行ning iOS 11.x 及更高版本中。
在 iOS11 之前,模拟器在启动时创建了全局(独立于应用程序)文档文件夹。自从iOS11.x(不知道是不是特别点发布)以后就不会再出现了。
请注意 NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
returns 此全局文档路径仅在(单元)测试中,而不是在 运行 应用程序中。如果您 运行 该应用程序,您将获得应用程序特定的文档文件夹,该文件夹在模拟器中安装该应用程序时仍会创建。
这似乎是苹果方面的一个错误。如果您 运行 遇到这个问题(您似乎遇到了),请在 https://developer.apple.com/bug-reporting/.
提交错误报告
正在尝试归档 Codable
个元素的数组。
do {
let data = try PropertyListEncoder().encode(elements)
let success = NSKeyedArchiver.archiveRootObject(data, toFile:self.archiveURL.path)
print(success ? "Successful save" : "Save Failed")
} catch {
print("Save Failed")
}
由于某种原因,路径 (archiveURL
) 经常出错:
let archiveURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
总是像这样返回 URL:
file:///Users/userName/Library/Developer/CoreSimulator/Devices/deviceID/data/Documents
但搜索文件夹时我没有看到 /Documents 文件夹。最近有什么变化吗?几周前它曾经工作过(很确定)。超级烦人,我找不到任何 workaround/fix。
我相信这是 iOS 模拟器的(新式)"feature" - 最初安装应用程序时,并非所有常用目录都存在。
幸运的是,创建它们很容易,例如对于 applicationSupport 目录,我在我的应用程序中这样做:
let fileManager = FileManager.default
let directory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first!
if !fileManager.fileExists(atPath: directory) {
try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil)
}
您不能(覆盖)写入 Documents
目录,您必须附加一个文件名。
为什么要存档数据?您可以将 属性 列表数据直接写入磁盘。
并且never ever在catch
子句中打印无意义的文字字符串,至少打印实际错误。
let fileName = "myPropertyList.plist"
let fileURL = archiveURL.appendingPathComponent(fileName)
do {
let data = try PropertyListEncoder().encode(elements)
try data.write(to: fileURL)
} catch {
print("Save Failed", error)
}
这发生在模拟器 运行ning iOS 11.x 及更高版本中。
在 iOS11 之前,模拟器在启动时创建了全局(独立于应用程序)文档文件夹。自从iOS11.x(不知道是不是特别点发布)以后就不会再出现了。
请注意 NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
returns 此全局文档路径仅在(单元)测试中,而不是在 运行 应用程序中。如果您 运行 该应用程序,您将获得应用程序特定的文档文件夹,该文件夹在模拟器中安装该应用程序时仍会创建。
这似乎是苹果方面的一个错误。如果您 运行 遇到这个问题(您似乎遇到了),请在 https://developer.apple.com/bug-reporting/.
提交错误报告