【问题标题】:Cannot create file or directory in documents folder in iOS sandbox无法在 iOS 沙箱的文档文件夹中创建文件或目录
【发布时间】:2017-08-31 07:32:14
【问题描述】:

我正在使用Xcode(version 8.2.1)iPad (v10.2.1) 上制作游戏,当我尝试将一些数据保存在沙盒的文档文件夹中时,我发现我尝试的所有方法都失败了:@987654323 @ 和 createFile(using file manager),以及 writeToUrl(使用 NSData)。我在 2 部 iPad 和 1 部 iPhone 上运行该程序,但没有成功。

我能够从我创建的 plist 中读取数据,并将其转换为字典,使用函数 convertDataFrom()

我是数据持久性或文件操作的新手,我的游戏卡在这里。将不胜感激任何帮助!

func loadData()->NSDictionary{
    let fm = FileManager()

    let sourceUrl = Bundle.main.url(forResource: "Data", withExtension: "plist")!
    var appSupportDir = fm.urls(for: .documentDirectory, in: .userDomainMask).first! as? NSURL
    appSupportDir = appSupportDir!.appendingPathComponent("UserData", isDirectory: true) as NSURL?
    let urlForSave = (appSupportDir!.appendingPathComponent("Data.plist"))!


    //load data, or if file doesn't exist yet, create one
    var isDirectory: ObjCBool = false

    if fm.fileExists(atPath: urlForSave.absoluteString, isDirectory: &isDirectory) {
        let data = convertDataFrom(url: urlForSave)
        print("data file exists")
        print(isDirectory)

        return data as NSDictionary

    } else {
        do { try fm.createDirectory(atPath: appSupportDir!.absoluteString!, withIntermediateDirectories: true, attributes: nil) }catch let Error {
            print("create directory failed")
            print(Error)
        }

        let originalData = NSData.init(contentsOf: sourceUrl)
        print("\(urlForSave)")
        do { try originalData?.write(toFile: urlForSave.absoluteString, options: .atomic) } catch let Error {
            print(Error)
        }
        if (!fm.createFile(atPath: urlForSave.absoluteString, contents: originalData as Data?, attributes: nil)) {
            fatalError("file creation failed")
        }

        let data = convertDataFrom(url: urlForSave)
        print("\(data)")
        print(isDirectory)

        return data as NSDictionary
    }

}

func convertDataFrom(url: URL)->Dictionary<String, Any> {
    let dictionary = NSDictionary.init(contentsOf: url) as! Dictionary<String, Any>
    return dictionary
}

“createDirectory”的错误消息:Error Domain=NSCocoaErrorDomain Code=513 "您没有权限将文件“UserData”保存在 文件夹“文档”。” UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/F7F41E0D-D3F6-489B-A59E-B7AC401EC402/Documents/UserData/, NSUnderlyingError=0x174053f50 {错误域=NSPOSIXErrorDomain 代码=1 "不允许操作"}} file:///var/mobile/Containers/Data/Application/F7F41E0D-D3F6-489B-A59E-B7AC401EC402/Documents/UserData/Data.plist

对于“createFile”(如果 createFile 失败,则为致命错误)错误 Domain=NSCocoaErrorDomain Code=4 "文件“Data.plist”没有 存在。” UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/F7F41E0D-D3F6-489B-A59E-B7AC401EC402/Documents/UserData/Data.plist, NSUnderlyingError=0x174055bd0 {错误域=NSPOSIXErrorDomain 代码=2 “没有这样的文件或目录”}} 致命错误:文件创建失败:文件 /Users/chanwu/Desktop/Math_DownStairs/Math_DownStairs/

【问题讨论】:

    标签: ios iphone xcode ipad swift3


    【解决方案1】:

    您的代码检查urlForSave(最终文件)是否存在,如果不存在,则尝试创建 UserData 目录。

    如果最终文件不存在,但 UserData 目录存在,我希望得到您描述的确切结果。

    您可能应该更改测试以查看 UserData 目录是否存在,而不是测试最终文件。这样,如果目录不存在,您将创建它,然后调用write(toFile:),如果文件不存在,它将创建文件。

    【讨论】:

    • 谢谢我按照你的建议做了。但看起来这不是根本问题。我现在使用 nsuserdefaults,因为我只需要保存一点数据。
    猜你喜欢
    • 2014-09-21
    • 2013-08-06
    • 1970-01-01
    • 2011-06-15
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多