iOS NSData.write(toFile) returns 将 zip 写入 cacheDirectory 时为 false
iOS NSData.write(toFile) returns false when writing zip to cacheDirectory
我正在尝试下载一个 zip 文件,并在解压缩之前将其写入 cacheDirectory。但是,write(toFile:) 总是 returns false:
import Foundation
func downloadFile(url: URL, completion: @escaping (Result<Data>) -> Void) {
print("starting dqueue to download " + url.absoluteString)
DispatchQueue.global(qos: .background).async {
print("Starting download")
let data = NSData.init(contentsOf: url)
if data == nil {
print("Data nil!")
}
// Find cache
print("Got data!")
let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
let path = paths[0]
let dataPath = URL(fileURLWithPath: path).appendingPathComponent("mod.zip")
if (FileManager.default.fileExists(atPath: dataPath.absoluteString)) {
print("File already exists!")
}
// Save data
print("Saving to " + dataPath.absoluteString)
if (data?.write(toFile: dataPath.absoluteString, atomically: true) ?? false) {
if (FileManager.default.fileExists(atPath: dataPath.absoluteString)) {
print("exists!")
} else {
print("does not exist!")
}
if (FileManager.default.isWritableFile(atPath: dataPath.absoluteString)) {
print("Writable")
}else {
print("Not Writable")
}
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
} else {
print("Failed to write to file!")
}
}
}
这是日志输出:
starting dqueue to download https://github.com/minetest-mods/armor_monoid/archive/c7988a3dae32f2c1cb93fde31d9e53222a205eea.zip
Starting download
Got data!
Saving to file:///var/mobile/Containers/Data/Application/E734C574-1E94-44CB-9A6E-2AE1C8850E88/Library/Caches/mod.zip
Failed to write to file!
我试过:
- 正在创建目录(它已经存在)
- 将 atomic 更改为 false(无影响)
- 正在尝试查看权限(找不到任何相关文档)
- 阅读并尝试以下问题:
- iOS: Can't save file to 'Application Support' folder, but can to 'Documents'
- Write to file does not work
我正在使用 Xcode v9.0 beta 2 (9M137d) 和 IPad Air 2 (iOS 11.0 15A5318g)
您需要使用 relativePath
而不是 absoluteString
。
试试这个(我试过了,有效):
import Foundation
func downloadFile(url: URL, completion: @escaping (Result<Data>) -> Void) {
print("starting dqueue to download " + url.absoluteString)
DispatchQueue.global(qos: .background).async {
print("Starting download")
let data = NSData.init(contentsOf: url)
if data == nil {
print("Data nil!")
}
// Find cache
print("Got data!")
let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
let path = paths[0]
let dataPath = URL(fileURLWithPath: path).appendingPathComponent("mod.zip")
if (FileManager.default.fileExists(atPath: dataPath.relativePath)) {
print("File already exists!")
}
// Save data
print("Saving to " + dataPath.relativePath)
if (data?.write(toFile: dataPath.relativePath, atomically: true) ?? false) {
if (FileManager.default.fileExists(atPath: dataPath.relativePath)) {
print("exists!")
} else {
print("does not exist!")
}
if (FileManager.default.isWritableFile(atPath: dataPath.relativePath)) {
print("Writable")
}else {
print("Not Writable")
}
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
} else {
print("Failed to write to file!")
}
}
}
我正在尝试下载一个 zip 文件,并在解压缩之前将其写入 cacheDirectory。但是,write(toFile:) 总是 returns false:
import Foundation
func downloadFile(url: URL, completion: @escaping (Result<Data>) -> Void) {
print("starting dqueue to download " + url.absoluteString)
DispatchQueue.global(qos: .background).async {
print("Starting download")
let data = NSData.init(contentsOf: url)
if data == nil {
print("Data nil!")
}
// Find cache
print("Got data!")
let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
let path = paths[0]
let dataPath = URL(fileURLWithPath: path).appendingPathComponent("mod.zip")
if (FileManager.default.fileExists(atPath: dataPath.absoluteString)) {
print("File already exists!")
}
// Save data
print("Saving to " + dataPath.absoluteString)
if (data?.write(toFile: dataPath.absoluteString, atomically: true) ?? false) {
if (FileManager.default.fileExists(atPath: dataPath.absoluteString)) {
print("exists!")
} else {
print("does not exist!")
}
if (FileManager.default.isWritableFile(atPath: dataPath.absoluteString)) {
print("Writable")
}else {
print("Not Writable")
}
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
} else {
print("Failed to write to file!")
}
}
}
这是日志输出:
starting dqueue to download https://github.com/minetest-mods/armor_monoid/archive/c7988a3dae32f2c1cb93fde31d9e53222a205eea.zip
Starting download
Got data!
Saving to file:///var/mobile/Containers/Data/Application/E734C574-1E94-44CB-9A6E-2AE1C8850E88/Library/Caches/mod.zip
Failed to write to file!
我试过:
- 正在创建目录(它已经存在)
- 将 atomic 更改为 false(无影响)
- 正在尝试查看权限(找不到任何相关文档)
- 阅读并尝试以下问题:
- iOS: Can't save file to 'Application Support' folder, but can to 'Documents'
- Write to file does not work
我正在使用 Xcode v9.0 beta 2 (9M137d) 和 IPad Air 2 (iOS 11.0 15A5318g)
您需要使用 relativePath
而不是 absoluteString
。
试试这个(我试过了,有效):
import Foundation
func downloadFile(url: URL, completion: @escaping (Result<Data>) -> Void) {
print("starting dqueue to download " + url.absoluteString)
DispatchQueue.global(qos: .background).async {
print("Starting download")
let data = NSData.init(contentsOf: url)
if data == nil {
print("Data nil!")
}
// Find cache
print("Got data!")
let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
let path = paths[0]
let dataPath = URL(fileURLWithPath: path).appendingPathComponent("mod.zip")
if (FileManager.default.fileExists(atPath: dataPath.relativePath)) {
print("File already exists!")
}
// Save data
print("Saving to " + dataPath.relativePath)
if (data?.write(toFile: dataPath.relativePath, atomically: true) ?? false) {
if (FileManager.default.fileExists(atPath: dataPath.relativePath)) {
print("exists!")
} else {
print("does not exist!")
}
if (FileManager.default.isWritableFile(atPath: dataPath.relativePath)) {
print("Writable")
}else {
print("Not Writable")
}
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
} else {
print("Failed to write to file!")
}
}
}