【问题标题】:Swift. How to append text line to top of file.txt?迅速。如何将文本行附加到 file.txt 的顶部?
【发布时间】:2019-06-04 10:09:30
【问题描述】:

我正在实现一个小型记录器,我正在其中写入一个 TXT 文件。 我希望最后一个事件位于文件的顶部,但我无法让它工作。网上所有的例子都是用“fileHandle.seekToEndOfFile()”写在文件末尾的。

这就是我所拥有的:

private static func writeToFile(text: String) {

        guard let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else { return }
        guard let writePath = NSURL(fileURLWithPath: path).appendingPathComponent(Logger.folderName) else { return }
        let fileManager = FileManager.default

        try? fileManager.createDirectory(atPath: writePath.path, withIntermediateDirectories: true)
        let file = writePath.appendingPathComponent(Logger.fileName)

        if !fileManager.fileExists(atPath: file.path) {
            do {
                try "".write(toFile: file.path, atomically: true, encoding: String.Encoding.utf8)
            } catch _ {
            }
        }

        let msgWithLine = text + "\n"
        do {
            let fileHandle = try FileHandle(forWritingTo: file)
            //fileHandle.seekToEndOfFile()
            fileHandle.write(msgWithLine.data(using: .utf8)!)
            fileHandle.closeFile()
        } catch {
            print("Error writing to file \(error)")
        }
    }

使用这段代码,我写在第一行,但是,我总是重写第一行的内容。

如何将其更改为第一个被带到下面一行然后在第一行写入新内容的内容?

谢谢!!

【问题讨论】:

  • fileHandle.seek(toFileOffset: 0) 代替 fileHandle.seekToEndOfFile() 怎么样
  • 为什么需要这种方式,正常的解决方法是在文件末尾追加?
  • @JoakimDanielson 我在一个应用程序内部有一个小的记录器视图,并且在最近的事件上显示是有意义的。我看到了 m1sh0 的解决方案,我看到它会很重。我会按照 m1sh0 的建议在文本文件上正常写入,然后恢复何时显示。
  • 这听起来是最好的解决方案!

标签: ios swift text-files filehandle


【解决方案1】:

这应该没问题: 首先,获取旧数据,然后附加新数据并写入所有内容。

let msgWithLine = text + "\n"
do {
    let fileHandle = try FileHandle(forWritingTo: file)
    fileHandle.seek(toFileOffset: 0)
    let oldData = try String(contentsOf: file, encoding: .utf8).data(using: .utf8)!
    var data = msgWithLine.data(using: .utf8)!
    data.append(oldData)
    fileHandle.write(data)
    fileHandle.closeFile()
} catch {
    print("Error writing to file \(error)")
}

我没有测试代码可能有一些问题。

另一种可能的解决方案是在文件末尾写入并在读取文件时反转文件。

【讨论】:

  • 它工作,我只需要改变这一行: let oldData = fileHandle.readDataToEndOfFile() 到这个: let oldData = try String(contentsOf: file, encoding: .utf8).data(using: .utf8)!
  • 但是即使在后台线程中工作,这样做也会是一个繁重的过程?
  • @TiagoMendes 你说得对,大文件会很重
  • @TiagoMendes 您可以想到的是,如果您以正常方式编写文件(例如在文件末尾添加文本)并且仅当您阅读以反转行时。但这与文件的写入和读取的总和有关。
  • 是的,你是对的,写正常,revert 是要走的路。感谢您的建议:) 我会正确标记您的答案。既然这就是问题的答案。
猜你喜欢
  • 2013-05-15
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多