Flutter中文件存在仍报错OS Error: No such file or directory(errno=2)求助
问题描述
我正尝试使用Google Cloud API将wav音频文件转换为文本。在将文件发送至转录服务前,通过File(path).readAsBytesSync().toList()函数上传文件时出现问题:尽管temp.wav文件存在且路径正确,在Android设备上运行却抛出错误OS Error: No such file or directory, errno = 2。
已尝试的排查手段(均未解决):
- 参考同类错误方案
- 清除缓存并重启项目
- 在pubspec.yaml中正确配置资产文件
- 尝试mp3等不同文件类型
- 更换Android设备测试
- 修改文件存储位置
- 执行
flutter doctor无异常
附完整代码、pubspec.yaml配置及文件结构截图。
可能的解决方案
1. 资产文件读取方式修正
如果temp.wav是作为项目资产文件存在,直接用File(path)读取会失败——资产文件打包后嵌入APK,不在设备文件系统路径中,需用rootBundle读取:
import 'package:flutter/services.dart' show rootBundle; final bytes = await rootBundle.load('assets/temp.wav'); final byteList = bytes.buffer.asUint8List();
同时确认pubspec.yaml的资产配置正确:
flutter: assets: - assets/temp.wav
2. 本地文件路径与权限处理
如果文件存储在设备本地,需确保路径绝对且权限到位:
- 权限配置:Android 10+需在
AndroidManifest.xml添加权限声明,并动态请求:
可借助<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>permission_handler包简化权限请求流程。 - 标准路径获取:用
path_provider包获取系统标准目录,避免硬编码路径:import 'package:path_provider/path_provider.dart'; final docDir = await getApplicationDocumentsDirectory(); final filePath = '${docDir.path}/temp.wav'; final byteList = File(filePath).readAsBytesSync().toList();
3. 文件存在性验证
读取前打印路径并验证文件存在性,定位路径问题:
final file = File(path); print('目标路径:${file.path}'); print('文件是否存在:${file.existsSync()}'); if (file.existsSync()) { final byteList = file.readAsBytesSync().toList(); // 后续转录逻辑 } else { print('路径无效,文件不存在'); }
4. Android存储规则适配
- Android 11+公共目录(如Downloads)直接路径读取受限,可改用存储访问框架(SAF)获取文件Uri,通过内容解析器读取字节。
- 优先将文件放在应用私有目录(如
getApplicationDocumentsDirectory()返回路径),无需额外权限即可访问。
内容的提问来源于stack exchange,提问作者Giuseppe Brandi
相关产品推荐
相关产品推荐

