You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS图片复制到临时目录后读取失败的技术问题求助

iOS临时目录文件读取失败问题解决

错误原因

你遇到的NSPOSIXErrorDomain Code=20 "Not a directory"错误,核心问题出在文件复制逻辑上:
你创建了临时目录的URL(tempDirectoryURL),但直接调用copyItem(at: imageurl, to: tempDirectoryURL)时,系统会把这个URL当成文件路径而非目录路径,最终tempDirectoryURL指向的是一个图片文件,不是你预期的目录。后续调用contentsOfDirectory(atPath:)读取一个文件的内容,自然会触发报错。

修正方案

需要先确保临时目录存在,再将图片复制到该目录下的具体文件路径,而非直接复制到目录URL上:

  1. 先创建并确保临时目录存在
  2. 拼接目标文件的完整URL:临时目录URL + 原图片的文件名
  3. 执行文件复制操作
  4. 读取临时目录内容

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:35:23