web-dev-qa-db-fra.com

écrire dans un fichier texte dans Swift 3

Bonjour, je suis assez nouveau dans la programmation Swift, alors veuillez supporter si je fais des erreurs évidentes. J'essaie d'écrire des données saisies par un utilisateur via textfield dans un fichier texte. Je parviens à le faire avec le code que j'ai écrit ci-dessous. Cependant, lorsque j'essaye de sauvegarder plus de données, il remplacera les données existantes dans le fichier texte par les nouvelles données en cours de sauvegarde. Par exemple, si je sauvegarde la chaîne 'hello world', puis enregistre une autre chaîne disant 'bye'. Je ne verrai que la chaîne 'bye' dans le fichier texte. Existe-t-il un moyen de modifier mon code pour que je puisse voir "Bonjour le monde" sur une ligne du textile et "au revoir" sur une autre.

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

Toute aide apportée est grandement appréciée ThankYou

6
Aneesa

Voici un exemple utilisant FIleHandler, adapté à Swift 3 , à partir de ici (bien sûr, vous devez ajouter tout le code de traitement des erreurs manquant dans mon exemple): 

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

Voici une version de Swift 4 en tant qu'extension de 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()
    }
}

}

0
Konrad77