无法将文件从捆绑包复制到iOS

时间:2015-12-17 23:30:26

标签: ios swift copy bundle

我正在尝试使用以下代码将文件从我的软件包复制到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 =(       复制   ),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 {错误域= NSPOSIXErrorDomain代码= 2"没有这样的文件或目录"}}

根据fileManager.fileExistsAtPath()文件确实存在。我做错了什么?

5 个答案:

答案 0 :(得分:14)

问题在于这一行:

let fullDestPathString = String(fullDestPath)

应该是:

let fullDestPathString = fullDestPath.path

查看错误。问题是目的地。请注意file:///。您的代码未正确将URL转换为文件路径。您需要使用path的{​​{1}}属性将路径作为字符串。

在所有调试和检查中,您从未验证过NSURL

的值

答案 1 :(得分:4)

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)
        }
    }

答案 2 :(得分:4)

Swift 4

在某些答案中误导:

  

print(fileManager.fileExists(atPath:bundlePath!))

因此提出了这个package de.scrum_master.stackoverflow import groovy.util.logging.Slf4j import org.junit.Rule import org.slf4j.Logger import spock.lang.Specification @Slf4j class LombokSlf4jLogTest extends Specification { def logger = Spy(new LoggerDelegate(originalLogger: log)) @Rule ReplaceSlf4jLogger replaceSlf4jLogger = new ReplaceSlf4jLogger(Clazz, logger) def "warning is logged"() { when: "when calling the method" new Clazz().method() then: "a warning is logged" 1 * logger.warn(*_) true } static class LoggerDelegate { @Delegate Logger originalLogger } } 版本:

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)
            }
        }
    }
}

答案 3 :(得分:3)

请查找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)

            }
        }

    }

检查此代码是否该路径上的文件不可用,然后复制该文件。

谢谢。

答案 4 :(得分:0)

获取你应该使用的字符串路径

let path = fullDestPath.path

旁注

fileManager.fileExistsAtPath(bundlePath!) == true 

是检查值是否为真的方法

fileManager.fileExistsAtPath(bundlePath!)

这可能会有一些问题