我无法将带有write(to:options :)的NSData对象保存到“库\应用程序支持”文件夹中。
我在模拟器和真实设备上尝试过。错误消息略有不同(请参见下文)。我还尝试了一个具有相同结果的子文件夹。
当我在Documents文件夹中尝试时,它确实起作用了。但是,我不想将此数据保存在用户可以看到的文件夹中。
guard let appSupportDirURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else {
return false
}
let fileName = "test.tst"
let appSupportDirWithFileNameURL = appSupportDirURL .appendingPathComponent(fileName, isDirectory: false)
do {
try persistentData.write(to: appSupportDirWithFileNameURL, options: .atomic)
} catch {
print(error)
}
真实设备上的错误:
Error Domain = NSCocoaErrorDomain代码= 4“文件夹“ test.tst”不存在。” UserInfo = {NSURL = file:///var/mobile/Containers/Data/Application/EBFD7DCC-78F6-43FB-BE7C-BEBDA263AC41/Library/Application%20Support/test.tst,NSUserStringVariant = Folder,NSUnderlyingError = 0x281b4dc50 {Error Domain = NSPOSIXErrorDomain代码= 2“没有这样的文件或目录”}} 零
模拟器错误:
Error Domain = NSCocoaErrorDomain代码= 512“文件“ test.tst”无法保存在文件夹“ Application Support”中。” UserInfo = {NSFilePath = / Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / E5BA9579-BC2C-4EE6-A263-0B7F2D878529 / Library / Application Support /test.tst,NSUnderlyingError=0x6000017a4a50 {Error Domain = NSPOSIXErrorDomain Code = 20“ Not a directory”}}
我了解到duplicate link的论点是,默认情况下,应用程序的沙箱中不存在“应用程序支持”文件夹,但是当我在 application(_:didFinishLaunchingWithOptions :)中执行以下代码时从打印输出中可以看到该文件夹存在,因为我之前创建过该文件夹。
if let libraryDirURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first {
let libraryDirContent = try? FileManager.default.contentsOfDirectory(at: libraryDirURL, includingPropertiesForKeys: nil, options: [])
print(libraryDirURL)
print(libraryDirContent)
}
file:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library / 可选([file:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /首选项/,文件:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /缓存/]) 文件:/// Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / DAE23378-444A-4E8A-8EA3-6B12A2B2714A / Library /应用程序%20Support /
错误仍然相同。
Error Domain = NSCocoaErrorDomain代码= 4“文件夹“ test.tst”不存在。” UserInfo = {NSFilePath = / Users / foobar / Library / Developer / CoreSimulator / Devices / 1D537733-1D4D-4B66-ABB3-91D6E4A7B2EF / data / Containers / Data / Application / 74CA2A5C-B49A-47E1-9C99-6890C6CFBBF0 / Library / Support / test,NSUserStringVariant =文件夹,NSUnderlyingError = 0x600003db7990 {Error Domain = NSPOSIXErrorDomain Code = 2“没有这样的文件或目录”}}
为了进行进一步的测试,我将其简化为直接在 application(_:didFinishLaunchingWithOptions:)中将字符串写入文件夹。如果有人可以告诉我到底是什么不起作用,将不胜感激。我先创建文件夹,然后再要求写入文件。错误是相同的。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
if let libraryDirURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first {
let libraryDirContent = try? FileManager.default.contentsOfDirectory(at: libraryDirURL, includingPropertiesForKeys: nil, options: [])
print(libraryDirURL)
print(libraryDirContent)
print()
do {
let f = "Appication Support"
let d = libraryDirURL.appendingPathComponent(f, isDirectory: true)
try FileManager.default.createDirectory(at: d, withIntermediateDirectories: true, attributes: nil)
} catch {
print("error")
}
let str = "test test test test"
let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
let filename = paths.appendingPathComponent("output.txt")
do {
try str.write(to: filename, atomically: true, encoding: String.Encoding.utf8)
print("YAY")
} catch {
print(error)
}
}
}