import Foundation extension URL { func ensureParentFolderExistence() throws { try deletingLastPathComponent().ensureFolderExistence() } func ensureFolderExistence() throws { guard !exists else { return } try FileManager.default.createDirectory(at: self, withIntermediateDirectories: true) } var isDirectory: Bool { (try? resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory == true } var exists: Bool { FileManager.default.fileExists(atPath: path) } /** Delete the file at the url. */ func delete() throws { try FileManager.default.removeItem(at: self) } func copy(to url: URL) throws { if url.exists { try url.delete() } try url.ensureParentFolderExistence() try FileManager.default.copyItem(at: self, to: url) } }