2017-04-05 18 views
2

iPad(v10.2.1)のゲームをXcode(version 8.2.1)で作成していますが、サンドボックス内のドキュメントフォルダにデータを保存しようとしていますが、失敗した方法:createDirectorycreateFile(using file manager)とwriteToUrl(NSDataを使用)。私は2つのiPadsと1つのiPhoneでプログラムを実行し、成功しませんでした。iOSサンドボックスのドキュメントフォルダにファイルやディレクトリを作成できません

私は作成した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 
} 

Error messages for "createDirectory": Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “UserData” in the folder “Documents”." UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/F7F41E0D-D3F6-489B-A59E-B7AC401EC402/Documents/UserData/, NSUnderlyingError=0x174053f50 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}} file:///var/mobile/Containers/Data/Application/F7F41E0D-D3F6-489B-A59E-B7AC401EC402/Documents/UserData/Data.plist

and for "createFile" (fatalError if createFile fails) Error Domain=NSCocoaErrorDomain Code=4 "The file “Data.plist” doesn’t exist." UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/F7F41E0D-D3F6-489B-A59E-B7AC401EC402/Documents/UserData/Data.plist, NSUnderlyingError=0x174055bd0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}} fatal error: file creation failed: file /Users/chanwu/Desktop/Math_DownStairs/Math_DownStairs/

答えて

1

あなたのコードurlForSave(最終的なファイル)が存在し、それがない場合、あなたはその後、UserDataのディレクトリを作成しようかどうかをチェックします。

最終ファイルが存在しないのにUserDataディレクトリが存在する場合、私はあなたが記述した正確な結果を期待します。

おそらく、最終ファイルのテストではなく、UserDataディレクトリが存在するかどうかを確認するテストを変更する必要があります。そうすれば、ディレクトリが存在しない場合は作成し、存在しない場合はファイルを作成するwrite(toFile:)を呼び出します。

+0

あなたが提案したように私はそれをしました。それは基本的な問題ではないように見えます。私はちょうど少しのデータを保存する必要があるので、現在はnsuserdefaultsを使用しています。 – Chandler

関連する問題