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

FileManager无法找到音频文件:iOS录音文件遍历异常求助

问题根源:误用URL的absoluteString属性给FileManager

嘿,我一眼就发现问题所在了——你在调用FileManager的方法时,错误地使用了URL的absoluteString属性,而不是适合本地文件系统的path属性!

为什么会失败?

FileManager的fileExists(atPath:)、contents(atPath:)等方法,要求传入的是本地文件系统的纯路径字符串(比如/var/mobile/Containers/Data/Application/.../test.caf)。但你用的audioFileUrl.absoluteString返回的是带file://前缀的完整URL字符串(就是你输出的file:///var/mobile/.../test.caf),这个格式和FileManager期望的完全不匹配,自然找不到文件。

修正后的代码示例

1. 检查文件是否存在

把absoluteString换成path:

// 之前错误的写法
// print("\(FileManager.default.fileExists(atPath: audioFileUrl.absoluteString))")

// 修正后的写法
print("\(FileManager.default.fileExists(atPath: audioFileUrl.path))") // 现在会返回true

2. 遍历Documents目录获取所有录音文件

同样把documentsDirectory.absoluteString换成documentsDirectory.path:

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
do {
    let results = try FileManager.default.contentsOfDirectory(atPath: documentsDirectory.path)
    // 过滤出.caf格式的录音文件
    let audioFiles = results.filter { $0.hasSuffix(".caf") }
    print("找到的录音文件:\(audioFiles)")
} catch {
    print("遍历目录失败:\(error)")
}

额外提示

在iOS中处理文件时,一定要区分URL的几个关键属性:

  • absoluteString:完整的URL字符串(带协议前缀,比如file://),适合用于URL相关的API(比如AVAudioRecorder/Player的初始化)。
  • path:本地文件系统的绝对路径(无协议前缀),专门给FileManager这类本地文件操作API使用。
  • relativePath:相对于当前工作目录的路径,一般用得比较少。

这样修改后,你就能正常遍历Documents目录下的所有录音文件,用来填充UITableViewController的数据源啦~

内容的提问来源于stack exchange,提问作者Dane Jordan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:36:43