【问题标题】:Swift 3: Error in copying file with FileManagerSwift 3:使用 FileManager 复制文件时出错
【发布时间】:2017-08-03 21:06:31
【问题描述】:

我的主包中有一个名为 Data.plist 的文件(位于应用程序目录的根目录),我正在尝试将此文件复制到用户文档目录以进行读写操作,但是,尝试复制文件时出现以下错误:

CFURLCopyResourcePropertyForKey 失败,因为它传递了一个没有方案的 URL

复制 Data.plist 时出错:Error Domain=NSCocoaErrorDomain Code=262 “无法打开文件,因为指定的 URL 类型不是 支持

代码:

let fileManager = FileManager.default

var docDirectory: String? {
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let docDir = paths.first
        return docDir
    }
    
var dataFilePath: String? {
        guard let docPath = self.docDirectory else { return nil }
        return docPath.appending("/Data.plist")
}


func copyFile() {
  guard let path = dataFilePath else {
            return
        }
        
        guard fileManager.fileExists(atPath: path) else {
//            NSLog("Creating Data.plist")
//            fileManager.createFile(atPath: path, contents: nil, attributes: nil) // create the file
//            NSLog("created Data.plist file successfully")
            
            if let bundlePath = Bundle.main.path(forResource: "Data", ofType: "plist") {
                do {
                    let fromURL = URL(string: bundlePath)! 
                    let toURL = URL(string: "file://\(path)")!
                    try fileManager.copyItem(at: fromURL, to: toURL)
                    NSLog("Copied Data.plist to Document directory")
                } catch let error {
                    NSLog("Error in copying Data.plist: \(error)") // see the above quoted error message from here
                }
            }
            
            return
        }

}

【问题讨论】:

    标签: ios swift3 nsfilemanager copy-item


    【解决方案1】:

    检查文件 Data.plist 在 XCODE 项目中是否存在。

    【讨论】:

      【解决方案2】:

      文件系统 URL 必须使用 fileURLWithPath 初始化程序创建,该初始化程序添加了错误消息所抱怨的 file:// 方案:

      let fromURL = URL(fileURLWithPath: bundlePath)
      let toURL = URL(fileURLWithPath: path)
      

      不过还有一种更方便的方法来创建fromURL

      if let fromURL = Bundle.main.url(forResource: "Data", withExtension: "plist") { ...
      

      我建议一般使用URL相关的API,例如

      var docDirectory: URL {
          return try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
      }
      
      var dataFileURL: URL {
          return docDirectory.appendingPathComponent("Data.plist")
      }
      

      最大的好处是您可以获得非可选值并摆脱几个guards。

      【讨论】:

      • 感谢您的快速回复。我发现使用字符串类型的路径可以很好地工作,而无需处理 NSURL:try fileManager.copyItem(at: bundlePath, to: path)
      • URL打交道并不麻烦,终于方便多了。
      猜你喜欢
      • 2014-09-10
      • 2021-04-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2017-12-20
      相关资源
      最近更新 更多