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

Flutter写入外部存储报错Is a directory(errno=21)求助

解决Flutter写入外部存储时的"Is a directory"错误

嘿,这问题我熟!你遇到的errno = 21(Is a directory)错误,根源很简单——你把要写入的文件路径当成目录创建了,后续再试图往这个路径写文件,系统当然会报错,因为它已经是个目录啦!

咱们来拆解下你的代码问题:

var testdir = await new Directory(directory.path + '/' + key).create(recursive: true);
return File(directory.path + '/' + key).writeAsBytesSync(response.bodyBytes);

这里的key应该是包含文件名的完整路径(比如videos/demo/test/ba90098ad645d2f70569e3bf9332db53_69.m3u8),所以你第一行代码相当于把这个文件路径直接创建成了目录,第二行又用同一个路径去创建文件,这就产生了冲突。

给你个简单的修正方案,核心是先创建文件的父目录,再写入文件:

// 拼接完整的文件路径
String fullFilePath = '${directory.path}/$key';
File targetFile = File(fullFilePath);

// 创建文件所在的父目录(自动处理多级目录,不用手动拆分)
await targetFile.parent.create(recursive: true);

// 现在可以安全地写入字节内容了
return targetFile.writeAsBytesSync(response.bodyBytes);

这个方案的优势在于:

  • 用targetFile.parent自动获取文件的父目录,不用手动拆分路径,避免了拼写错误
  • create(recursive: true)会自动创建所有不存在的上级目录,兼容性更强

最后再提个小提醒:别忘了确认你的应用已经申请了对应的存储权限。Android 10及以上推荐用Scoped Storage,Android 13+如果需要访问非媒体文件,可能需要申请MANAGE_EXTERNAL_STORAGE权限,你可以用Flutter的permission_handler包来简化权限申请流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:43:11