ios - 如何快速打开文件并在其中附加字符串

标签 ios swift

我正在尝试将字符串附加到文本文件中。我正在使用以下代码。

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
}

这不会将字符串附加到文件中。即使我重复调用这个函数。

最佳答案

如果您希望能够控制是否追加,请考虑使用OutputStream。例如:

do {
    let fileURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        .appendingPathComponent("votes.txt")
    
    guard let outputStream = OutputStream(url: fileURL, append: true) else {
        print("Unable to open file")
        return
    }

    outputStream.open()
    let text = "some text\n"
    try outputStream.write(text)
    outputStream.close()
} catch {
    print(error)
}

顺便说一句,这是一个扩展,可让您轻松地将String(或Data)写入OutputStream:

extension OutputStream {
    enum OutputStreamError: Error {
        case stringConversionFailure
        case bufferFailure
        case writeFailure
    }

    /// 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`.

    func write(_ string: String, encoding: String.Encoding = .utf8, allowLossyConversion: Bool = false) throws {
        guard let data = string.data(using: encoding, allowLossyConversion: allowLossyConversion) else {
            throw OutputStreamError.stringConversionFailure
        }
        try write(data)
    }

    /// Write `Data` to `OutputStream`
    ///
    /// - parameter data:                  The `Data` to write.

    func write(_ data: Data) throws {
        try data.withUnsafeBytes { (buffer: UnsafeRawBufferPointer) throws in
            guard var pointer = buffer.baseAddress?.assumingMemoryBound(to: UInt8.self) else {
                throw OutputStreamError.bufferFailure
            }

            var bytesRemaining = buffer.count

            while bytesRemaining > 0 {
                let bytesWritten = write(pointer, maxLength: bytesRemaining)
                if bytesWritten < 0 {
                    throw OutputStreamError.writeFailure
                }

                bytesRemaining -= bytesWritten
                pointer += bytesWritten
            }
        }
    }
}

有关 Swift 2 版本,请参阅 previous revision这个答案。

关于ios - 如何快速打开文件并在其中附加字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870537/

相关文章:

ios - UIView 中的 Swift Share 表

objective-c - 将属性分配给 sudzc 中的对象

ios - Target 在 Swift 中分离线程的意义

ios - 如何使 SwiftUI 循环中的元素全屏显示?与 Apple 一样,当今的应用程序

iphone - 将垂直滚动手势传递给下面的 UITableView

linux - Swift on Linux - 导入第三方模块

ios - ios 14 中的 .ply(多边形)格式文件问题

ios - 没有这样的模块 "Sinch"Xcode 9.1 Swift 4

ios - 性能 UIImageView 与 UIView 与 QuartzCore

ios - 编辑嵌套对象后核心数据关系丢失