一尘不染

在Swift中将NSLog重定向到文件不起作用

swift

我正在尝试将NSLog发送到在Simulator,IOS 10.2上运行的Swift 3中的文件中并且什么都没有产生

func redirectConsoleLogToDocumentFolder() {
    let file = "file.txt"
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {

        let logPath = dir.appendingPathComponent(file).absoluteString
        print("log:\(logPath)")
        freopen(logPath, "a+", stderr)
    }
    NSLog("print nslog")
}

输出量

~/Library/Developer/CoreSimulator/Devices/A7B717-3ED8-493A-9778-C594AF9FF446/data/Containers/Data/Application/B0386-64BB-46EB-9BF2-65209FC748CD/Documents/file.txt

唯一的效果是输出不再打印到控制台。

我努力了

freopen(logPath.cString(using: .utf8), "a+", stderr)

和其他各种组合

我毫不费力地用接收到的路径写一个文件,所以这没有任何问题

我希望在路径中看到一个名为file.txt的文件,并且该文件包含“ print nslog”。我尝试先创建文件,但没有成功。


阅读 261

收藏
2020-07-07

共1个答案

一尘不染

absoluteString属性URL产生一个URL字符串,例如

    文件:///path/to/file.txt

不适合作为的参数freopen()。要以字符串形式获取文件路径,请path改用:

let logPath = dir.appendingPathComponent(file).path

更好的方法是,使用专用方法将URL路径传递给系统调用:

let logFileURL = dir.appendingPathComponent(file)
logFileURL.withUnsafeFileSystemRepresentation {
    _ = freopen($0, "a+", stderr)
}
2020-07-07