创建单独的文件

时间:2017-06-30 11:02:11

标签: ios swift swift3 createfile writetofile

我正在寻找一种创建单独文件的方法。例如:我有一个应用程序,其中包含名称,日期等形式,当我按保存时,我想将用户的该形式的所有信息保存到文件中。每次填写表单时,我都希望为每个用户创建一个新文件。该文件将保存在应用程序的文档目录中。该文件的名称应来自表单的“名称”文本字段。我已经研究了在swift中创建文件的方法,但文件名总是在路径url中进行硬编码,每次填写表单时,信息都会保存在同一个文件中。我不想这样做。感谢任何解决方案或建议,我似乎无法在线找到任何解决方案(只有如何创建具有硬编码文件名的文件,我已经能够做到)。

import UIKit

class FormViewController: UIViewController {

    @IBOutlet weak var organdonationno: UITextField!
    @IBOutlet weak var donorage: UITextField!
    @IBOutlet weak var snodname: UITextField!
    @IBOutlet weak var donorshospital: UITextField!
    @IBOutlet weak var date: UITextField!
    @IBOutlet weak var ID: UITextField!

    var fileMgr: FileManager = FileManager.default
    var docsDir: String?
    var dataFile: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        let filemgr = FileManager.default
        let dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
        dataFile = dirPaths[0].appendingPathComponent("path").path
        if filemgr.fileExists(atPath: dataFile!) {
            let databuffer1 = filemgr.contents(atPath: dataFile!)
            let databuffer2 = filemgr.contents(atPath: dataFile!)
            let databuffer3 = filemgr.contents(atPath: dataFile!)
            let databuffer4 = filemgr.contents(atPath: dataFile!)
            let databuffer5 = filemgr.contents(atPath: dataFile!)

            let datastring1 = NSString(data: databuffer1!, encoding: String.Encoding.utf8.rawValue)
            let datastring2 = NSString(data: databuffer2!, encoding: String.Encoding.utf8.rawValue)
            let datastring3 = NSString(data: databuffer3!, encoding: String.Encoding.utf8.rawValue)
            let datastring4 = NSString(data: databuffer4!, encoding: String.Encoding.utf8.rawValue)
            let datastring5 = NSString(data: databuffer5!, encoding: String.Encoding.utf8.rawValue)

            organdonationno.text = datastring1 as? String
            donorage.text = datastring2 as? String
            snodname.text = datastring3 as? String
            donorshospital.text = datastring4 as? String
            date.text = datastring5 as? String
        }
        // Do any additional setup after loading the view.
    }

    @IBAction func savdata(_ sender: Any) {
        let databuffer1 = (organdonationno.text)!.data(using: String.Encoding.utf8)
         let databuffer2 = (donorage.text)!.data(using:  String.Encoding.utf8)
         let databuffer3 = (snodname.text)!.data(using: String.Encoding.utf8)
         let databuffer4 = (donorshospital.text)!.data(using: String.Encoding.utf8)
         let databuffer5 = (date.text)!.data(using: String.Encoding.utf8)

        fileMgr.createFile(atPath: dataFile!, contents: databuffer1, attributes: nil)
        fileMgr.createFile(atPath: dataFile!, contents: databuffer2, attributes: nil)
        fileMgr.createFile(atPath: dataFile!, contents: databuffer3, attributes: nil)
        fileMgr.createFile(atPath: dataFile!, contents: databuffer4, attributes: nil)
        fileMgr.createFile(atPath: dataFile!, contents: databuffer5, attributes: nil)

    }
}

2 个答案:

答案 0 :(得分:1)

它只保存日期,因为您使用相同的名称为每个字段创建文件。它每次都被新文件覆盖。上次创建的文件是日期,因此只有日期持续存在。如果要保存一个用户的所有表单数据,可以按照以下方式执行。您需要为每个表单创建动态文件名,以便覆盖它。

@IBAction func savdata(_ sender: Any) {

 let fileName="\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) "

 let file = "\(fileName).txt" //this is the file. we will write to and read from it

 let text = fileName //just a text

 if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {

 let path = dir.appendingPathComponent(file)

 //writing
 do {
    try text.write(to: path, atomically: false, encoding: String.Encoding.utf8)
  }
  catch {/* error handling here */}

  //reading
  do {
     let text2 = try String(contentsOf: path, encoding: String.Encoding.utf8)
  }
 catch {/* error handling here */}
}

------ -------- EDIT

要移除Optional单词,需要通过在需要打开的对象后放置感叹号(!)来强行打开该值。

 var canBeNil : String? = "shubhra"
 print(canBeNil)  // output Optional("shubhra")
 print(canBeNil!)  // output shubhra

如果您需要标题为organdonationno只需编辑:

 let fileName="\(organdonationno.text)"
 let text = "\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) "

只需确保您的文件名是唯一的,这样就不会被覆盖。

希望它有所帮助。快乐编码!!

答案 1 :(得分:1)

我的解决方案似乎与上面类似。您最好使用用户从文本字段输入的信息来组织文件的唯一名称。我强烈建议您编写一个模型来存储您的属性,并为了清除编码而执行保存到磁盘的工作。我可以举一个我刚刚在操场上写的例子:

struct User {
let organdonationno: NSString
let donorage: NSString
let snodName: NSString
let donorshospital: NSString
let date: NSString
let ID: NSString

func saveToJSONFile() {
    guard let documentDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

    let pathComponent = ID.appending(".json")

    let array = NSArray(array: [organdonationno, donorage, snodName, donorshospital, date, ID])

    let fileURL = documentDirectoryUrl.appendingPathComponent(pathComponent)

    do {
        let data = try JSONSerialization.data(withJSONObject: array, options: [])
        try data.write(to: fileURL, options: .atomic)
    }
    catch {
        print(error)
    }
}

}

我正在编写的代码将struct的属性放入NSArray,它可以很容易地序列化为JSON对象。 JSON是一种显示良好的数据结构。当它写入您的磁盘文件时,您可以打开.json文件以查看内部。它就像[ string1, string2, string3, string4, string5, string6]一样,很容易理解 你可以这样使用它:

let user = User(organdonationno: datastring1, donorage: datastring2, snodName: datastring3, donorshospital: datastring4, date: datastring5, ID: datastring6)
user.saveToJSONFile()

如果您使用的是swift 4,则可以方便地将User结构转换为JSON对象。您只需要让User符合Codable,而苹果的底层实现将完成所有工作。

Struct User: Codable {