Flutter创建CSV文件时提示No such file or directory错误如何解决?
问题原因排查
- 父目录不存在:代码中直接向
${tempPath}/my_rents/CSV/路径下写文件,但没有提前创建my_rents/CSV这两级父目录,系统找不到写入路径会直接抛出IO异常,这是最核心的报错原因。 - 异步方法未加await:
writeAsString是异步方法,代码中没有加await修饰,不仅无法保证执行顺序,异常也无法正常捕获,会出现看似无报错但文件未生成的问题。 - Android权限适配错误:
Permission.storage仅适用于Android 12及以下系统,Android 13以上该权限已被废弃,申请后不会生效;此外如果仅写入应用私有目录(包括临时目录、应用文档目录、应用专属外部存储目录),本就不需要申请任何存储权限,多余的权限申请反而会带来不必要的兼容性问题。 - 强制解包空风险:Android高版本中
getExternalStorageDirectory()可能返回null,代码中使用!强制解包会直接抛出空指针异常。
解决方案
- 提前创建父目录,补全异步修饰
写文件前先递归创建所有父目录,所有异步方法统一加await,建议套try-catch捕获异常方便定位问题,修改后的核心代码如下:
try { String csv = const ListToCsvConverter().convert(rows); Directory tempDir = await getTemporaryDirectory(); String tempPath = tempDir.path; File csvFile = File("${tempPath}/my_rents/CSV/filename.csv"); // 递归创建父目录,已存在也不会报错 await csvFile.parent.create(recursive: true); // 异步写入文件 await csvFile.writeAsString(csv); } catch (e) { print("CSV文件创建失败: $e"); }
- 适配空安全逻辑
修改外部存储目录的获取逻辑,避免强制解包导致的空异常:
if (Platform.isAndroid) { final? externalDir = await getExternalStorageDirectory(); dir2 = externalDir?.path ?? appDocPath; } else if (Platform.isIOS) { dir2 = appDocPath; }
- 清理多余权限配置
如果仅将文件保存在应用私有目录下,直接删除所有存储权限申请代码即可;如果需要将文件保存到公共目录供用户查看,再按需适配对应版本的权限:
- Android 12及以下:申请
Permission.storage - Android 13及以上:根据存储内容申请
Permission.photos/Permission.videos/Permission.audio,如果需要访问所有公共文件可申请Permission.manageExternalStorage - iOS:按需配置Info.plist中的文件访问权限声明
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

