无法将文件从包复制到 iOS 中的文档目录
Can`t copy file from bundle to documents directory in iOS
我正在尝试使用以下代码将文件从我的包复制到 iOS 中的文档目录。
let bundlePath = NSBundle.mainBundle().pathForResource("information", ofType: ".png")
print(bundlePath, "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
let fileManager = NSFileManager.defaultManager()
let fullDestPath = NSURL(fileURLWithPath: destPath).URLByAppendingPathComponent("information.png")
let fullDestPathString = String(fullDestPath)
print(fileManager.fileExistsAtPath(bundlePath!)) // prints true
do{
try fileManager.copyItemAtPath(bundlePath!, toPath: fullDestPathString)
}catch{
print("\n")
print(error)
}
Error Domain=NSCocoaErrorDomain Code=4 "The file “information.png” doesn’t exist." UserInfo={NSSourceFilePathErrorKey=/Users/macbookpro/Library/Developer/CoreSimulator/Devices/E58CA1C6-C6F1-4D72-9572-3925675E78A5/data/Containers/Bundle/Application/EFA83E02-5F24-4BB3-B32A-7E755081A730/AutoLayout tuts.app/information.png, NSUserStringVariant=(
Copy
), NSDestinationFilePath=file:///Users/macbookpro/Library/Developer/CoreSimulator/Devices/E58CA1C6-C6F1-4D72-9572-3925675E78A5/data/Containers/Data/Application/86A1BDD5-FAF2-486E-85A9-CF72A547C6CD/Documents/information.png, NSFilePath=/Users/macbookpro/Library/Developer/CoreSimulator/Devices/E58CA1C6-C6F1-4D72-9572-3925675E78A5/data/Containers/Bundle/Application/EFA83E02-5F24-4BB3-B32A-7E755081A730/AutoLayout tuts.app/information.png, NSUnderlyingError=0x7fb53251cd80 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
根据 fileManager.fileExistsAtPath()
,该文件确实存在。我做错了什么?
问题出在这一行:
let fullDestPathString = String(fullDestPath)
应该是:
let fullDestPathString = fullDestPath.path
查看错误。问题是目的地。注意 file:///
。您的代码没有正确地将 URL 转换为文件路径。您需要使用 NSURL
的 path
属性 来获取字符串形式的路径。
在你所有的调试和检查中,你从未验证过 fullDestPathString
的值。
要获取您应该使用的字符串路径
let path = fullDestPath.path
边注
fileManager.fileExistsAtPath(bundlePath!) == true
是检查值是否为真的方法
fileManager.fileExistsAtPath(bundlePath!)
就是这样会有些问题
请查找代码 Below.i 参考了@rmaddy 的回答。
func CheckDataBaseOnPathorNot() -> Void {
let bundlePath = Bundle.main.path(forResource: "Project_Expert", ofType: ".db")
print(bundlePath ?? "", "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let fileManager = FileManager.default
let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("Project_Expert.db")
let fullDestPathString = fullDestPath!.path
print(fileManager.fileExists(atPath: bundlePath!)) // prints true
if fileManager.fileExists(atPath: fullDestPathString) {
print("File is available")
}else{
do{
try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString)
}catch{
print("\n")
print(error)
}
}
}
检查此代码,如果文件在路径上不可用,则复制文件。
谢谢。
Swift 3
func copyfileToDocs()
{
let bundlePath = Bundle.main.path(forResource: "db", ofType: ".sqlite")
print(bundlePath!, "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let fileManager = FileManager.default
let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("db.sqlite")
let fullDestPathString = fullDestPath?.path
print(fileManager.fileExists(atPath: bundlePath!)) // prints true
do
{
try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString!)
print("DB Copied")
}
catch
{
print("\n")
print(error)
}
}
Swift 4
某些答案具有误导性:
print(fileManager.fileExists(atPath: bundlePath!))
因此提出这个 extension
版本:
extension FileManager {
func copyfileToUserDocumentDirectory(forResource name: String,
ofType ext: String) throws
{
if let bundlePath = Bundle.main.path(forResource: name, ofType: ext),
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
.userDomainMask,
true).first {
let fileName = "\(name).\(ext)"
let fullDestPath = URL(fileURLWithPath: destPath)
.appendingPathComponent(fileName)
let fullDestPathString = fullDestPath.path
if !self.fileExists(atPath: fullDestPathString) {
try self.copyItem(atPath: bundlePath, toPath: fullDestPathString)
}
}
}
}
用法
try fileManager.copyfileToUserDocumentDirectory(forResource: "information",
ofType: "png")
...
我正在尝试使用以下代码将文件从我的包复制到 iOS 中的文档目录。
let bundlePath = NSBundle.mainBundle().pathForResource("information", ofType: ".png")
print(bundlePath, "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
let fileManager = NSFileManager.defaultManager()
let fullDestPath = NSURL(fileURLWithPath: destPath).URLByAppendingPathComponent("information.png")
let fullDestPathString = String(fullDestPath)
print(fileManager.fileExistsAtPath(bundlePath!)) // prints true
do{
try fileManager.copyItemAtPath(bundlePath!, toPath: fullDestPathString)
}catch{
print("\n")
print(error)
}
Error Domain=NSCocoaErrorDomain Code=4 "The file “information.png” doesn’t exist." UserInfo={NSSourceFilePathErrorKey=/Users/macbookpro/Library/Developer/CoreSimulator/Devices/E58CA1C6-C6F1-4D72-9572-3925675E78A5/data/Containers/Bundle/Application/EFA83E02-5F24-4BB3-B32A-7E755081A730/AutoLayout tuts.app/information.png, NSUserStringVariant=( Copy ), NSDestinationFilePath=file:///Users/macbookpro/Library/Developer/CoreSimulator/Devices/E58CA1C6-C6F1-4D72-9572-3925675E78A5/data/Containers/Data/Application/86A1BDD5-FAF2-486E-85A9-CF72A547C6CD/Documents/information.png, NSFilePath=/Users/macbookpro/Library/Developer/CoreSimulator/Devices/E58CA1C6-C6F1-4D72-9572-3925675E78A5/data/Containers/Bundle/Application/EFA83E02-5F24-4BB3-B32A-7E755081A730/AutoLayout tuts.app/information.png, NSUnderlyingError=0x7fb53251cd80 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
根据 fileManager.fileExistsAtPath()
,该文件确实存在。我做错了什么?
问题出在这一行:
let fullDestPathString = String(fullDestPath)
应该是:
let fullDestPathString = fullDestPath.path
查看错误。问题是目的地。注意 file:///
。您的代码没有正确地将 URL 转换为文件路径。您需要使用 NSURL
的 path
属性 来获取字符串形式的路径。
在你所有的调试和检查中,你从未验证过 fullDestPathString
的值。
要获取您应该使用的字符串路径
let path = fullDestPath.path
边注
fileManager.fileExistsAtPath(bundlePath!) == true
是检查值是否为真的方法
fileManager.fileExistsAtPath(bundlePath!)
就是这样会有些问题
请查找代码 Below.i 参考了@rmaddy 的回答。
func CheckDataBaseOnPathorNot() -> Void {
let bundlePath = Bundle.main.path(forResource: "Project_Expert", ofType: ".db")
print(bundlePath ?? "", "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let fileManager = FileManager.default
let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("Project_Expert.db")
let fullDestPathString = fullDestPath!.path
print(fileManager.fileExists(atPath: bundlePath!)) // prints true
if fileManager.fileExists(atPath: fullDestPathString) {
print("File is available")
}else{
do{
try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString)
}catch{
print("\n")
print(error)
}
}
}
检查此代码,如果文件在路径上不可用,则复制文件。
谢谢。
Swift 3
func copyfileToDocs()
{
let bundlePath = Bundle.main.path(forResource: "db", ofType: ".sqlite")
print(bundlePath!, "\n") //prints the correct path
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let fileManager = FileManager.default
let fullDestPath = NSURL(fileURLWithPath: destPath).appendingPathComponent("db.sqlite")
let fullDestPathString = fullDestPath?.path
print(fileManager.fileExists(atPath: bundlePath!)) // prints true
do
{
try fileManager.copyItem(atPath: bundlePath!, toPath: fullDestPathString!)
print("DB Copied")
}
catch
{
print("\n")
print(error)
}
}
Swift 4
某些答案具有误导性:
print(fileManager.fileExists(atPath: bundlePath!))
因此提出这个 extension
版本:
extension FileManager {
func copyfileToUserDocumentDirectory(forResource name: String,
ofType ext: String) throws
{
if let bundlePath = Bundle.main.path(forResource: name, ofType: ext),
let destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
.userDomainMask,
true).first {
let fileName = "\(name).\(ext)"
let fullDestPath = URL(fileURLWithPath: destPath)
.appendingPathComponent(fileName)
let fullDestPathString = fullDestPath.path
if !self.fileExists(atPath: fullDestPathString) {
try self.copyItem(atPath: bundlePath, toPath: fullDestPathString)
}
}
}
}
用法
try fileManager.copyfileToUserDocumentDirectory(forResource: "information",
ofType: "png")
...