web-dev-qa-db-ja.com

Swift 3でテキストファイルに書き込む

ユーザーがUITextFieldを介して入力したデータをテキストファイルに書き込もうとしています。以下に書いたコードでこれをうまく行うことができます。ただし、さらにデータを保存しようとすると、テキストファイル内の既存のデータが保存されている新しいデータに置き換えられます。たとえば、文字列「hello world」を保存してから、「bye」という別の文字列を保存するとします。テキストファイルには文字列「bye」のみが表示されます。テキスタイルの1行に「helloworld」が表示され、別の行に「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)
   }
}
7
Aneesa

これはFIleHandlerを使用した例で、Swift 3here に適合しています(もちろん追加する必要があります)私の例で欠落しているすべてのエラー処理コード):

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)
}
7
Bogdan Farca

これは、Stringの拡張機能としてのSwift 4バージョンです。

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()
    }
}

}

0
Konrad77