【问题标题】:Writing to log file seems to overwrite previous save写入日志文件似乎会覆盖以前的保存
【发布时间】:2016-04-11 08:22:45
【问题描述】:

作为练习,我正在尝试编写一个将字符串记录到文本文件的日志记录类。我有我的应用程序可以从文件中写入和读取。但是,如果我尝试多次记录,它似乎只会获取最新的日志。

尝试

写作

private let file = "logfile.txt"

func write(text: String) {

    let path = getDocumentsDirectory()

    do {
        try text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding)
    }
    catch let error {
        print("error: \n \(error)")
    }
}

阅读

func read() {

    let path = getDocumentsDirectory()

    do {
        let text2 = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)

        print("From Log: \n \(text2)")
    }
    catch let error {
        print("error: \n \(error)")
    }


}

func getDocumentsDirectory() -> String {
    guard let dir : NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first else {
        return ""
    }
    let documentsDirectory : String = dir.stringByAppendingPathComponent(file)
    return documentsDirectory
}

结果

当我尝试读取我的文件时,我只保存了最后一行。

问题

如果我的目标是不断地将新日志附加到文件中,并批量读取日志文件。我需要对我的代码进行哪些更改?


更多详情:

我在应用程序加载时写入文件:

Logger.shared.write("instance one writes")
Logger.shared.write("instance one writes again")
Logger.shared.write("instance one writes yet again") 

然后尝试阅读:

Logger.shared.read()

输出:

来自日志:
实例一再次写入

【问题讨论】:

  • 相反,您使用完全相同的方法 (writeToFile(_:atomically:encoding:)) 会产生完全相同的问题,我会推荐完全相同的解决方案 (NSFileHandle)。语言差异几乎不值得一提,特别是因为接受的答案提供了一个查看文档的地方,而不是实际代码。
  • 如果您愿意,还有一个类似的问题:stackoverflow.com/questions/4779877/…
  • @jtbandes 我找不到一个人在 Swift 中使用 NSFileHandle 的例子,就像你在两个帖子中那样。 .fileHandleForWritingAtPath 在 Swift 中不可用。
  • 它是一个初始化器而不是一个静态方法;此处的文档中给出了 Obj-C 和等效的 Swift 语法:developer.apple.com/library/mac/documentation/Cocoa/Reference/…:

标签: swift logging writetofile


【解决方案1】:

Foundation 提供的writeToFile(_:atomically:encoding:) 方法替换给定文件的内容。 附加到文件有几种方法:

【讨论】:

  • 感谢您的宝贵时间,抱歉给您带来困难。
  • 没问题。为草率道歉——通常很难判断何时值得为 Swift 重写答案,因为这些 API 在功能上与 Obj-C 相同(只是语法不同),所以好的答案通常已经存在于错误的语言中。对于每个 Swift 应用程序开发人员,我建议他们至少获得一点 familiarity with Obj-C — 阅读足够 Obj-C 以转换为 Swift 的能力非常有用。
  • 我确实计划好了,我现在还在学习 Swift 课程,所以 Cocoa 框架对我来说是全新的。再次感谢。
  • 我建议您浏览nshipster.com 上的文章——他们几乎所有的代码示例都在 Obj-C 和 Swift 中,因此您可以轻松地比较它们。同时你会学到一些关于 Cocoa 的东西 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 2011-01-30
  • 2012-09-02
  • 1970-01-01
  • 2017-09-25
相关资源
最近更新 更多