iOS图片复制到临时目录后读取失败的技术问题求助
iOS临时目录文件读取失败问题解决
错误原因
你遇到的NSPOSIXErrorDomain Code=20 "Not a directory"错误,核心问题出在文件复制逻辑上:
你创建了临时目录的URL(tempDirectoryURL),但直接调用copyItem(at: imageurl, to: tempDirectoryURL)时,系统会把这个URL当成文件路径而非目录路径,最终tempDirectoryURL指向的是一个图片文件,不是你预期的目录。后续调用contentsOfDirectory(atPath:)读取一个文件的内容,自然会触发报错。
修正方案
需要先确保临时目录存在,再将图片复制到该目录下的具体文件路径,而非直接复制到目录URL上:
- 先创建并确保临时目录存在
- 拼接目标文件的完整URL:临时目录URL + 原图片的文件名
- 执行文件复制操作
- 读取临时目录内容
修正后的完整代码
func getNotificationImageUrl() -> URL? { guard let _documentPath = self.documentPath else{ return nil } do { // 获取目录内容 let directoryContents = try FileManager.default.contentsOfDirectory(at: _documentPath, includingPropertiesForKeys: nil, options: []) // 筛选包含"banner"的图片文件 let imageurl = directoryContents.first(where: { $0.lastPathComponent.contains("banner")}) if let imageurl = imageurl { print("[DEBUG] [\(#function)] [\(#line)] imageurl : \(imageurl)") // 1. 创建临时目录URL let tempDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString, isDirectory: true) // 确保临时目录存在(不存在则创建) try FileManager.default.createDirectory(at: tempDirectoryURL, withIntermediateDirectories: true) // 2. 拼接目标文件的完整URL:临时目录 + 原图片文件名 let targetFileURL = tempDirectoryURL.appendingPathComponent(imageurl.lastPathComponent) // 3. 复制图片文件到目标路径 try FileManager.default.copyItem(at: imageurl, to: targetFileURL) // 4. 读取临时目录内容 let items = try FileManager.default.contentsOfDirectory(atPath: tempDirectoryURL.path) for item in items { print("[DEBUG] [\(#function)] [\(#line)] Found \(item)") } return tempDirectoryURL } } catch let error as NSError { print("[DEBUG] [\(#function)] [\(#line)] getNotificationImageUrl : \(error) ") } return nil }
额外说明
针对你提到的UNNotificationAttachment使用场景:
- 确保返回的
tempDirectoryURL或targetFileURL路径正确、权限充足,符合系统要求 - 系统会自动将附件移至自身存储,临时目录的文件后续可正常清理,无需担心残留
内容的提问来源于stack exchange,提问作者WCY
相关产品推荐
相关产品推荐

