【问题标题】:iOS9 Swift File Creating NSFileManager.createDirectoryAtPath with NSURLiOS9 Swift 文件使用 NSURL 创建 NSFileManager.createDirectoryAtPath
【发布时间】:2015-12-16 01:35:40
【问题描述】:

在iOS9之前,我们是这样创建目录的

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
let logsPath = documentsPath.stringByAppendingPathComponent("logs")
let errorPointer = NSErrorPointer()
NSFileManager.defaultManager().createDirectoryAtPath(logsPath, withIntermediateDirectories: true, attributes: nil, error: errorPointer)

但在 iOS9 中,他们删除了 String.stringByAppendingPathComponent。自动转换工具用 NSURL 代替了我们对 String 的使用。 createDirectoryAtPath() 需要一个字符串,所以我需要将 NSURL 转换为字符串。我们像这样使用 absolutePath:(iOS9 的更新)

let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let logsPath = documentsPath.URLByAppendingPathComponent("logs")
do {
    try NSFileManager.defaultManager().createDirectoryAtPath(logsPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}

但我收到以下错误:

无法创建目录 Error Domain=NSCocoaErrorDomain Code=513 “您无权将“日志”文件保存在文件夹中 “文件”。” UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs/, NSUnderlyingError=0x15664d070 {错误域=NSPOSIXErrorDomain 代码=1 "不允许操作"}}

【问题讨论】:

    标签: swift ios9 nsfilemanager


    【解决方案1】:

    我想出了这个。 createDirectoryAtPath() 无法处理带有“file://”前缀的路径。要获取不带前缀的路径,您必须使用 path() 或 relativePath()。

    let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
    let logsPath = documentsPath.URLByAppendingPathComponent("logs")
    do {
        try NSFileManager.defaultManager().createDirectoryAtPath(logsPath.path!, withIntermediateDirectories: true, attributes: nil)
    } catch let error as NSError {
        NSLog("Unable to create directory \(error.debugDescription)")
    }
    

    路径不正确(注意文件://):

    file:///var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs/

    正确路径:

    /var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs/

    【讨论】:

    • relativePath 是赢家。我有 .absoluteString 但似乎早就过时了。
    • 你拯救了我的一天
    【解决方案2】:

    斯威夫特 3

    let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
    let logsPath = documentsPath.appendingPathComponent("logs")
    do {
        try FileManager.default.createDirectory(at: logsPath!, withIntermediateDirectories: true, attributes: nil)
    } catch let error as NSError {
        NSLog("Unable to create directory \(error.debugDescription)")
    }
    

    【讨论】:

      【解决方案3】:

      斯威夫特 4

      let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
      let logsPath = paths[0].appendingPathComponent("logs")
      do {
          try FileManager.default.createDirectory(at: logsPath, withIntermediateDirectories: true, attributes: nil)
      } catch let error as NSError {
          NSLog("Unable to create directory \(error.debugDescription)")
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-04
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        相关资源
        最近更新 更多