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
相关产品推荐
相关产品推荐

