Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在iOS中将文件从捆绑包复制到文档目录_Ios_Swift_Copy_Bundle - Fatal编程技术网

无法在iOS中将文件从捆绑包复制到文档目录

无法在iOS中将文件从捆绑包复制到文档目录,ios,swift,copy,bundle,Ios,Swift,Copy,Bundle,我正在尝试使用以下代码将文件从我的包复制到iOS中的documents目录 let bundlePath = NSBundle.mainBundle().pathForResource("information", ofType: ".png") print(bundlePath, "\n") //prints the correct path let destPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .User

我正在尝试使用以下代码将文件从我的包复制到iOS中的documents目录

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)
}
错误域=nscocaerorrordomain Code=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=( 复制 ),nsdestinationplepath=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-4BB32A-7E755081A730/AutoLayout tuts.app/information.png,NSUnderlyingError=0x7fb53251cd80{Error Domain=NSPOSIXErrorDomain Code=2“没有这样的文件或目录”}


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

问题是这一行:

let fullDestPathString = String(fullDestPath)
应该是:

let fullDestPathString = fullDestPath.path
查看错误。问题是目标。请注意
文件://
。您的代码没有正确地将URL转换为文件路径。您需要使用
NSURL
path
属性以字符串形式获取路径


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

的值,要获取字符串路径,您应该使用此

let path = fullDestPath.path
旁注

fileManager.fileExistsAtPath(bundlePath!) == true 
是检查值是否为真的方法

fileManager.fileExistsAtPath(bundlePath!)

只是这可能会有一些问题

请查找下面的代码。我参考了@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)
        }
    }
斯威夫特4 有些答案具有误导性:

打印(fileManager.fileExists(路径:bundlePath!))

因此,提出了这一
扩展
版本:

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")
...

谢谢,它现在可以工作了。我甚至没有想到查看
fullDestPathString
,因为错误消息:“file information.png不存在”。这就是为什么我完全专注于这一点。同样的问题,但仍然得到了解决problem@TheBaj同意,错误消息令人沮丧地误导!