【问题标题】:Get Document Directory Inbox file and move获取文档目录收件箱文件并移动
【发布时间】:2016-04-03 11:59:48
【问题描述】:

我的应用中有一个传入的PDF 附件。它以NSURL 的形式出现在AppDelegate 中:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {

文件打印到print日志为:

传入文件: file:///private/var/mobile/Containers/Data/Application/65E4F19F-98DD-4A4E-8A49-E1C564D135D8/Documents/Inbox/Burrito.pdf

如何从DocumentDirectory Inbox 文件夹中取出文件,默认情况下该文件夹是为传入文件放置的?我尝试创建一个名为“Recipes”的新文件夹,然后将其移至此文件夹,但不会出现错误:

无法创建目录 Error Domain=NSCocoaErrorDomain Code=516 ““Burrito-2.pdf”无法移动到“文档”,因为有一个项目 同名已经存在。” UserInfo={NSSourceFilePathErrorKey=/private/var/mobile/Containers/Data/Application/D5C9B472-B880-4D68-BA0D-31BA545E2150/Documents/Inbox/Burrito.pdf, NSUserStringVariant=( 移动),NSDestinationFilePath=/var/mobile/Containers/Data/Application/D5C9B472-B880-4D68-BA0D-31BA545E2150/Documents/Recipes, NSFilePath=/private/var/mobile/Containers/Data/Application/D5C9B472-B880-4D68-BA0D-31BA545E2150/Documents/Inbox/Burrito.pdf, NSUnderlyingError=0x13912e0e0 {错误域=NSPOSIXErrorDomain 代码=17 “文件存在”}}

我移动文件的代码是:

    // Incoming file
    print("Incoming File: \(incomingFileTransfer)")

    // File Manager
    let filemgr = NSFileManager.defaultManager()

    // Document Directory
    var dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

    // Documents Location
    let docsDir = dirPaths[0] //as! String
    print("Documents Folder: \(docsDir)")

    print("------------------------")

    // Create a new folder in the directory named "Recipes"
    print("Creating new folder...")
    let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
    let newPath = documentsPath.URLByAppendingPathComponent("Recipes")
    do {
        try NSFileManager.defaultManager().createDirectoryAtPath(newPath.path!, withIntermediateDirectories: true, attributes: nil)
    } catch let error as NSError {
        NSLog("Unable to create directory \(error.debugDescription)")
    }
    print("New Path: \(newPath)")
    print("------------------------")


    // Moving item in folder
    print("Moving PDf file to new folder...")

    let startingPath = incomingFileTransfer
    let endingPath = newPath

    do {
       try filemgr.moveItemAtURL(startingPath, toURL: endingPath)
    } catch let error as NSError {
        NSLog("Unable to create directory \(error.debugDescription)")
    }

我是 Swift 新手,并且一直在研究有关文件管理的在线和文档,但无法弄清楚这一点。我看了here,但它是不同的,而且在Objective-C;转换为 Swift 对我来说很难。我正在使用Xcode7Swift2,谢谢。

【问题讨论】:

    标签: ios swift swift2 nsurl nsfilemanager


    【解决方案1】:

    当您第二次运行应用程序并且目录已经创建并且文件已经被移动时,您会遇到错误。

    苹果强烈推荐使用NSFileManager的URL相关API

    首先获取文档目录

    // File Manager
    let filemgr = NSFileManager.defaultManager()
    
    // Document Directory
    let docsDirURL = try! filemgr.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
    

    try! 语句是安全的,因为文档目录始终存在。

    然后检查Recipes目录是否存在。如果没有,请创建它

    let recipesURL = docsDirURL.URLByAppendingPathComponent("Recipes")
    if !filemgr.fileExistsAtPath(recipesURL.path!) {
      do {
        try filemgr.createDirectoryAtURL(recipesURL, withIntermediateDirectories: false, attributes: nil)
        print("Directory created at: \(recipesURL)")
      } catch let error as NSError {
        NSLog("Unable to create directory \(error.debugDescription)")
        return
      }
    }
    

    你也可以检查目标文件是否存在

    let incomingFileName = incomingFileTransfer.lastPathComponent!
    
    let startingURL = incomingFileTransfer
    let endingURL = recipesURL.URLByAppendingPathComponent(incomingFileName)
    
    if !filemgr.fileExistsAtPath(endingURL.path!) {
      do {
        try filemgr.moveItemAtURL(startingURL, toURL: endingURL)
      } catch let error as NSError {
        NSLog("Unable to move file \(error.debugDescription)")
      }
    }
    

    【讨论】:

    • 我为我的项目做了一些调整,效果很好,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多