【问题标题】:Writing to text file in swift 3在swift 3中写入文本文件
【发布时间】:2017-07-10 23:13:06
【问题描述】:

我正在尝试将用户通过UITextField 输入的数据写入文本文件。我可以通过我在下面编写的代码成功地做到这一点。但是,当我尝试保存更多数据时,它将用正在保存的新数据替换文本文件中的现有数据。例如,如果我保存字符串“hello world”,然后保存另一个字符串说“再见”。我只会在文本文件中看到字符串“再见”。有没有办法可以修改我的代码,这样我就可以在纺织品的一行看到“hello world”,在另一行看到“bye”。

@IBAction func btnclicked(_ sender: Any) {        
   self.savedata(value: answer.text!)
}

func savedata (value: String){    
   let fileName = "Test"
   let DocumentDirURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

   let fileURL = DocumentDirURL.appendingPathComponent(fileName).appendingPathExtension("txt")
   print("FilePath: \(fileURL.path)")

   let writeString = NSString(string: answer.text!)
   do {
      // Write to the file
      try writeString.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8.rawValue)
   } catch let error as NSError {
         print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
   }
}

【问题讨论】:

  • 你应该使用NSFileHandle,它可以寻找到文件的末尾

标签: swift3 ios10 writetofile


【解决方案1】:

这是一个使用 FIleHandler 的示例,适用于 Swift 3,来自 here(当然您应该添加我示例中缺少的所有错误处理代码):

let dir = FileManager.default.urls(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).first!
let fileurl =  dir.appendingPathComponent("log.txt")

let string = "\(NSDate())\n"
let data = string.data(using: .utf8, allowLossyConversion: false)!

if FileManager.default.fileExists(atPath: fileurl.path) {
    if let fileHandle = try? FileHandle(forUpdating: fileurl) {
        fileHandle.seekToEndOfFile()
        fileHandle.write(data)
        fileHandle.closeFile()
    }
} else {
    try! data.write(to: fileurl, options: Data.WritingOptions.atomic)
}

【讨论】:

    【解决方案2】:

    这是一个 Swift 4 版本作为 String 的扩展。

    extension String {
    
    func writeToFile(fileName: String) {
        guard let dir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else {
            return
        }
    
        let fileUrl = dir.appendingPathComponent(fileName)
        guard let data = self.data(using: .utf8) else {
            return
        }
    
        guard FileManager.default.fileExists(atPath: fileUrl.path) else {
            try? data.write(to: fileUrl, options: .atomic)
            return
        }
    
        if let fileHandle = try? FileHandle(forUpdating: fileUrl) {
            fileHandle.seekToEndOfFile()
            fileHandle.write(data)
            fileHandle.closeFile()
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多