使用Flutter Sound录音报No such file or directory错误如何解决
报错原因
你遇到的ENOENT (No such file or directory)错误,核心原因是getApplicationDocumentsDirectory()返回的应用私有文档目录(对应路径里的app_flutter文件夹)在部分设备、系统版本上不会默认自动创建,直接向不存在的目录写入录音文件就会触发该异常。手动拼接路径时硬编码斜杠也可能在部分平台触发路径格式错误。
修复方案
核心逻辑是:拿到目标目录路径后,先校验目录是否存在,不存在则递归创建所有缺失的目录层级,再拼接文件路径写入录音。
- 先引入所需的内置/官方插件依赖:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; // 用于安全拼接路径,适配多平台分隔符规则
- 替换原有路径获取逻辑,增加目录校验创建步骤:
// 获取应用文档目录 Directory appDocDir = await getApplicationDocumentsDirectory(); // 校验目录是否存在,不存在则递归创建全路径目录 if (!await appDocDir.exists()) { await appDocDir.create(recursive: true); } // 安全拼接录音文件路径,不要手动硬编码斜杠 String recordFileName = '${DateTime.now().millisecondsSinceEpoch}.wav'; filepath = path.join(appDocDir.path, recordFileName); // 后续初始化录音机逻辑保持不变 _myRecorder = FlutterSoundRecorder();
额外场景说明
- 如果你需要将录音分类存到子文件夹(例如专门的
recordings目录),对子目录也要做相同的存在校验和创建逻辑:
// 定义录音专属子目录 Directory audioDir = Directory(path.join(appDocDir.path, 'recordings')); if (!await audioDir.exists()) { await audioDir.create(recursive: true); } // 最终文件路径指向子目录 filepath = path.join(audioDir.path, recordFileName);
create(recursive: true)参数可以保证路径上所有缺失的父目录都会被自动创建,不会出现多层级目录找不到的问题。getApplicationDocumentsDirectory()返回的是应用私有存储目录,在Android 10及以上版本不需要额外申请存储读写权限即可正常读写,不会触发权限异常。
内容的提问来源于stack exchange,提问作者Wagner Tiburcio
相关产品推荐
相关产品推荐

