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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:50:25