If you want to be able to control whether to add or not, consider using an OutputStream . For instance:
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") }
By the way, this is an extension that allows you to easily write a String to an 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<UInt8>) -> 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 } }
Or, in 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") }
and
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<UInt8>(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 } }
source share