我正在尝试将字符串附加到文本文件中。我使用以下代码。
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
}
这不会将字符串追加到文件中。即使我反复调用此函数。
答案 0 :(得分:20)
如果您希望能够控制是否追加,请考虑使用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")
}
顺便说一下,这是一个扩展程序,可让您轻松地将String
写入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
}
}
或者,在 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
}
}
答案 1 :(得分:2)
您还可以使用FileHandle将String附加到文本文件中。如果你只是想在你的文本文件的末尾附加你的文本文件,只需要调用seekToEndOfFile方法,写下你的字符串数据,并在完成后关闭它:
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)
}
答案 2 :(得分: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)
}
}
答案 3 :(得分:0)
检查阅读部分。
方法cotentsOfFile:
是NSString
类的方法。你错误地使用了它。
所以替换这一行
let text2 = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)
您必须使用NSString
代替String
类。
let text2 = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)
答案 4 :(得分:0)
一个对我有用的简单解决方案。更新,看来我一定是从这里得到的,因此应归功于应归功于: Append text or data to text file in Swift
用法:
print(df2)
# dur out ytd_dol proj_ytd_dol
#0 1 1 110 3960.00
#1 3 1 3600 4500.00
#2 4 1 6302 6932.20
#3 3 2 1300 2860.00
#4 4 2 3450 4398.75
#5 4 3 1550 3447.20
代码:
"Hello, world".appendToURL(fileURL: url)