Swift 指定したDocuments直下にファイルを生成するときにフォルダも作成したいが出来なかった。


実現したかったこと

アプリ内で保持している保存領域のDocumentsフォルダがあります。
その直下にフォルダ「private」を作成し、その直下にファイルを直置きしたいです。

しかしながら、フォルダが存在しない場合はファイルの作成が失敗しました。
色々調べましたが、相対パスなら出来ると描いてありましたが、結局できず。

解決方法としては以下になります。

  • フォルダが存在するか確認する
  • 存在しない場合:フォルダを作成し、ファイルを作成する
  • 存在する場合:ファイルを作成する

フォルダの実在確認について

        let filmManager = FileManager()
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        let targetFolderPath = documentsPath + "/private"
        
        let IsExistTargetFolder = FileManager.default.fileExists(atPath: applogPath)
        
        if (IsExistTargetFolder == false) {
	// 存在していない場合だけ作成処理が行われる。
            do {
                try filmManager.createDirectory(atPath: targetFolderPath, withIntermediateDirectories: true, attributes: nil)
                //        let filePath: String = path + "/app_log" + "/data.txt"
                
            } catch let error1 {
                print("Error createDirectory : \(targetFolderPath) : " , error1.localizedDescription ," \(#function)[\(#line)]" )
              //  return false  こちらを実装しているメソッドで戻り値成功or失敗のBoolなどでご活用ください
            }
        }

ファイルを作成する処理

シンプルに指定ディレクトリにファイルを作成する処理です。

func createApplicationLog ()  -> Bool{
        
        let filmManager = FileManager()
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
       let filePath: String = path + "/private" + "/file.text"  // 拡張子指定なしも可能です。


        // 保存したいデータ
        let saveText = "saveText"

        //アーカイブしてdata.datというファイル名で保存する
        let successful = NSKeyedArchiver.archiveRootObject(saveText, toFile: filePath)
	
	return successful // 成功ならtrue 失敗ならfalse
	
}