如何将文件写入位于Swift 4中Apple文件应用程序的文件夹?

我在我的Xcode项目中有一个XML文件,我试图先把它保存到磁盘,其次我怎么能告诉我,如果我已经成功地保存它? 这是正确的方法吗? 使用模拟器我导航到新的“文件”文件夹在iOS 11中,我没有看到它,但我不知道它应该在那里或没有?

guard let path = Bundle.main.url(forResource: "sample", withExtension: "xml") else {print("NO URL"); return} let sample = try? Data(contentsOf: path) print("sample XML = \(String(describing: sample?.debugDescription))") //put xml file on the device let filename = getDocumentsDirectory().appendingPathComponent("sample.xml") do { try sample?.write(to: filename) } catch { print("ERROR") } 

更新包括我的检查,如果文件存在:

  //check if file exists let checkPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String let url = URL(fileURLWithPath: checkPath) let filePath = url.appendingPathComponent("sample.xml").path let fileManager = FileManager.default if fileManager.fileExists(atPath: filePath) { print("FILE AVAILABLE") } else { print("FILE NOT AVAILABLE") } 

你可以使用UIDocumentInteractionController,并让用户select你想要保存你的文件,当你分享你的url。 用户只需要select保存到文件,并select保存您要导出的文件的目录。 您可以使用UIDocumentInteractionController共享您的应用程序包内的任何文件types,在您的文档目录或从您的应用程序可访问的另一个文件夹。

 class ViewController: UIViewController { let documentInteractionController = UIDocumentInteractionController() func share(url: URL) { documentInteractionController.url = url documentInteractionController.uti = url.typeIdentifier ?? "public.data, public.content" documentInteractionController.name = url.localizedName ?? url.lastPathComponent documentInteractionController.presentOptionsMenu(from: view.frame, in: view, animated: true) } @IBAction func shareAction(_ sender: UIButton) { guard let url = URL(string: "https://www.ibm.com/support/knowledgecenter/SVU13_7.2.1/com.ibm.ismsaas.doc/reference/AssetsImportCompleteSample.csv?view=kc") else { return } URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, error == nil else { return } let tmpURL = FileManager.default.temporaryDirectory .appendingPathComponent(response?.suggestedFilename ?? "fileName.csv") do { try data.write(to: tmpURL) } catch { print(error) } DispatchQueue.main.async { self.share(url: tmpURL) } }.resume() } } extension URL { var typeIdentifier: String? { return (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier } var localizedName: String? { return (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName } }