获取文档目录收件箱文件并移动

Get Document Directory Inbox file and move

我的应用程序中有一个传入的 PDF 附件。它作为 NSURLAppDelegate:

中分配进来

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

文件在 print 日志中打印为:

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

如何从 DocumentDirectory Inbox 文件夹中取出文件,该文件夹默认用于传入文件?我尝试创建一个名为 "Recipes" 的新文件夹,然后将其移动到此文件夹,但不会出现错误:

Unable to create directory Error Domain=NSCocoaErrorDomain Code=516 "“Burrito-2.pdf” couldn’t be moved to “Documents” because an item with the same name already exists." UserInfo={NSSourceFilePathErrorKey=/private/var/mobile/Containers/Data/Application/D5C9B472-B880-4D68-BA0D-31BA545E2150/Documents/Inbox/Burrito.pdf, NSUserStringVariant=( Move ), 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 {Error Domain=NSPOSIXErrorDomain Code=17 "File exists"}}

我移动文件的代码是:

    // 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,谢谢。

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

苹果强烈推荐使用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)")
  }
}