Cómo abrir un archivo y anexar una cadena, rápido

Estoy tratando de agregar una cadena en el archivo de texto. Estoy usando el siguiente código.

let dirs : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] if (dirs) != nil { let dir = dirs![0] //documents directory let path = dir.stringByAppendingPathComponent("votes") let text = "some text" //writing text.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil) //reading let text2 = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil) println(text2) //prints some text } 

esto no agrega la cadena al archivo. Incluso si llamo a esta función repetidamente.

Si desea poder controlar si agregar o no, considere usar OutputStream . Por ejemplo:

SWIFT 3

 let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) .appendingPathComponent("votes.txt") if let outputStream = OutputStream(url: fileURL, append: true) { outputStream.open() let text = "some text\n" let bytesWritten = outputStream.write(text) if bytesWritten < 0 { print("write failure") } outputStream.close() } else { print("Unable to open file") } 

Por cierto, esta es una extensión que te permite escribir fácilmente un String en un OutputStream :

 extension OutputStream { /// Write `String` to `OutputStream` /// /// - parameter string: The `String` to write. /// - parameter encoding: The `String.Encoding` to use when writing the string. This will default to `.utf8`. /// - parameter allowLossyConversion: Whether to permit lossy conversion when writing the string. Defaults to `false`. /// /// - returns: Return total number of bytes written upon success. Return `-1` upon failure. func write(_ string: String, encoding: String.Encoding = .utf8, allowLossyConversion: Bool = false) -> Int { if let data = string.data(using: encoding, allowLossyConversion: allowLossyConversion) { return data.withUnsafeBytes { (bytes: UnsafePointer) -> Int in var pointer = bytes var bytesRemaining = data.count var totalBytesWritten = 0 while bytesRemaining > 0 { let bytesWritten = self.write(pointer, maxLength: bytesRemaining) if bytesWritten < 0 { return -1 } bytesRemaining -= bytesWritten pointer += bytesWritten totalBytesWritten += bytesWritten } return totalBytesWritten } } return -1 } } 

O bien, en Swift 2, use NSOutputStream :

 let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) let path = documents.URLByAppendingPathComponent("votes").path! if let outputStream = NSOutputStream(toFileAtPath: path, append: true) { outputStream.open() let text = "some text" outputStream.write(text) outputStream.close() } else { print("Unable to open file") } 

Y

 extension NSOutputStream { /// Write `String` to `NSOutputStream` /// /// - parameter string: The string to write. /// - parameter encoding: The NSStringEncoding to use when writing the string. This will default to UTF8. /// - parameter allowLossyConversion: Whether to permit lossy conversion when writing the string. Defaults to `false`. /// /// - returns: Return total number of bytes written upon success. Return -1 upon failure. func write(string: String, encoding: NSStringEncoding = NSUTF8StringEncoding, allowLossyConversion: Bool = false) -> Int { if let data = string.dataUsingEncoding(encoding, allowLossyConversion: allowLossyConversion) { var bytes = UnsafePointer(data.bytes) var bytesRemaining = data.length var totalBytesWritten = 0 while bytesRemaining > 0 { let bytesWritten = self.write(bytes, maxLength: bytesRemaining) if bytesWritten < 0 { return -1 } bytesRemaining -= bytesWritten bytes += bytesWritten totalBytesWritten += bytesWritten } return totalBytesWritten } return -1 } } 

También puede usar FileHandle para agregar Cadena a su archivo de texto. Si solo desea agregar su cadena al final de su archivo de texto simplemente llame al método seekToEndOfFile , escriba sus datos de cadena y simplemente ciérrelo cuando haya terminado:


Uso de FileHandle Swift 3 o posterior

 let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! // create a new text file at your documents directory or use an existing text file resource url let fileURL = documentsDirectory.appendingPathComponent("simpleText.txt") do { try Data("Hello World\n".utf8).write(to: fileURL) } catch { print(error) } // open your text file and set the file pointer at the end of it do { let fileHandle = try FileHandle(forWritingTo: fileURL) fileHandle.seekToEndOfFile() // convert your string to data or load it from another resource let str = "Line 1\nLine 2\n" let textData = Data(str.utf8) // append your text to your text file fileHandle.write(textData) // close it when done fileHandle.closeFile() // testing/reading the file edited if let text = try? String(contentsOf: fileURL, encoding: .utf8) { print(text) // "Hello World\nLine 1\nLine 2\n\n" } } catch { print(error) } 

Por favor, compruebe el siguiente código ya que funciona para mí. Simplemente agregue el código tal como es:

 let theDocumetFolderSavingFiles = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String let filePath = "/theUserData.txt" let thePathToFile = theDocumetFolderSavingFiles.stringByAppendingString(filePath) let theFileManager = NSFileManager.defaultManager() if(theFileManager.fileExistsAtPath(thePathToFile)){ do { let stringToStore = "Hello working fine" try stringToStore.writeToFile(thePathToFile, atomically: true, encoding: NSUTF8StringEncoding) }catch let error as NSError { print("we are geting exception\(error.domain)") } do{ let fetchResult = try NSString(contentsOfFile: thePathToFile, encoding: NSUTF8StringEncoding) print("The Result is:-- \(fetchResult)") }catch let errorFound as NSError{ print("\(errorFound)") } }else { // Code to Delete file if existing do{ try theFileManager.removeItemAtPath(thePathToFile) }catch let erorFound as NSError{ print(erorFound) } } 

Verifique la parte de lectura.

El método cotentsOfFile: es un método de la clase NSString . Y lo has usado de manera incorrecta.

Entonces reemplace esta línea

let text2 = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)

Aquí debe usar NSString lugar de String clase String .

let text2 = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)