如何打开文件并在其中附加一个string,swift

我正在尝试追加一个string到文本文件。 我正在使用下面的代码。

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 } 

这不会将该string附加到文件。 即使我反复调用这个函数。

如果你想能够控制是否追加,考虑使用OutputStream 。 例如:

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

顺便说一句,这是一个扩展,可以让你轻松地写一个StringOutputStream

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

或者,在Swift 2中使用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") } 

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

请检查下面的代码作为它为我工作。 只需添加代码就可以了:

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

您也可以使用FileHandle将String附加到您的文本文件。 如果你只是想追加你的string,你的文本文件的末尾只要调用seekToEndOfFile方法,写下你的string数据,并在完成时closures它:


FileHandle使用Swift 3或更高版本

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

检查阅读部分。

方法cotentsOfFile:NSString类的一个方法。 而你有错误的方式使用它。

所以replace这一行

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

在这里你必须使用NSString而不是String类。

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