无法将文件从捆绑包复制到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) } 

错误域= NSCocoaErrorDomain代码= 4“文件”information.png“不存在。” 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转换为文件路径。 您需要使用NSURLpath属性将路径作为字符串。

在所有调试和检查中,您从未validationfullDestPathString的值。

请找到Code 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) } } } 

如果文件在路径上不可用,请检查此代码,然后复制该文件。

谢谢。

斯威夫特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) } } 

斯威夫特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") ... 

要获取字符串路径,您应该使用它

 let path = fullDestPath.path 

旁注

 fileManager.fileExistsAtPath(bundlePath!) == true 

是检查值是否为true的方法

 fileManager.fileExistsAtPath(bundlePath!) 

这可能会有一些问题