无法将文件从捆绑包复制到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转换为文件路径。 您需要使用NSURL
的path
属性将路径作为字符串。
在所有调试和检查中,您从未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!)
这可能会有一些问题