【问题标题】:Swift 4.0 - Unable to create empty text file in iOSSwift 4.0 - 无法在 iOS 中创建空文本文件
【发布时间】:2019-02-28 01:59:05
【问题描述】:

以下是我的代码 - 我试图获取文档目录路径并使用标准 FileManager 单例尝试创建文件,但我无法创建文件,因为错误 -

无法存储数据:Error Domain=NSCocoaErrorDomain Code=4“文件“CrashLog.txt”不存在。”

UserInfo={NSFilePath=file:///Users/ABC/Library/Developer/CoreSimulator/Devices/87317777-63E7-422B-A55F-878E3267AFB8/data/Containers/Data/Application/4B41AA87-E4B9-4EE4-A67F -AC3B018913CC/文档/崩溃日志, NSUnderlyingError=0x600000244ec0 {错误域=NSPOSIXErrorDomain Code=2 "没有这样的文件或目录"}}

开发中的代码 -

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
if (paths.count > 0) {
    let documentsDirectory = paths[0]
    let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt").absoluteString
    let _string = "Hello"
    //Create file at given path
    let data = _string.data(using: .utf8)
    //let attributes = FileManager.default.attributesOfItem(atPath: logFilePath)
    let fileExists : Bool = FileManager.default.fileExists(atPath: logFilePath)
    print(fileExists)
    let isFileCreated =  FileManager.default.createFile(atPath: logFilePath, contents: data, attributes: nil)
    print("ifFileCreated", isFileCreated)
}

【问题讨论】:

  • Nvm,我没有正确阅读您的代码。不管@Larme 说什么!
  • let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt") 相反,不要使用absoluteString,所以:(atPath: logFilePath.path)(两次)应该可以解决问题。
  • 我不记得确切的答案,但请记住 .absoluteString.path 返回不同的东西,我记得有一个问题是由使用 absoluteString 而不是路径引起的。

标签: ios swift nsfilemanager


【解决方案1】:

这是我对你所做的事情的看法。采用基于 URL 的方式处理文件。写入数据的最佳方式(至少对于本示例而言)是使用 Data 的功能(不是 FileManager)再次使用 URL 写入文件。大多数情况下,您无需担心文件是否存在;就这样做,并处理出现的任何错误。

    if var url = try? FileManager.default.url(for: .documentDirectory,
                                              in: .userDomainMask,
                                              appropriateFor: nil,
                                              create: false) {
        url = url.appendingPathComponent("CrashLog").appendingPathExtension("txt")
        let _string = "Hello"
        if let data = _string.data(using: .utf8) {
            do {
                try data.write(to: url)
                print("successful")
            } catch {
                print("unsuccessful")
            }
        }
    }

【讨论】:

    【解决方案2】:

    API absoluteString 错误。正确的 API 是path

    absoluteString 返回整个 URL 字符串表示形式,包括方案 file://。另一方面,FileManagerpath API 需要文件系统路径,字符串没有方案。

    我们鼓励您无论如何都使用与 URL 相关的 API,并且您可以将 Data 直接写入磁盘而无需显式创建文件。

    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let logFileURL = documentsURL.appendingPathComponent("CrashLog.txt")
    let string = "Hello"
    
    let data = Data(string.utf8)
    
    let fileExists = FileManager.default.fileExists(atPath: logFileURL.path)
    print(fileExists)
    do {
        try data.write(to: logFileURL)
        print("data written")
    } catch { print(error) }
    

    【讨论】:

      【解决方案3】:

      appendingPathComponent 方法如果接收者(例如参数)没有以斜杠结尾,那么它可能会读取文件元数据以确定结果路径是否为目录。这意味着它可能会产生您所看到的错误,因此最好使用 appendingPathComponent(_:isDirectory:) 代替。

      例如:

      let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt", isDirectory: false).absoluteString
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        相关资源
        最近更新 更多