Flutter复制sqflite数据库到外部存储报Is a directory错误如何解决
错误原因
报错OS Error: Is a directory的核心原因是File.copy()方法要求传入完整的目标文件路径,你当前传入的directory.path是/storage/emulated/0/databaseBackup这个文件夹路径,系统无法把一个文件覆盖写入到目录对象上,因此抛出异常。
修复步骤
- 修正copy方法的入参
把目标文件夹路径和要保存的数据库文件名拼接成完整的目标文件路径,修改代码中copy的调用逻辑:
// 原错误代码 var cop = await f.copy(directory.path); // 修改后代码 final targetFilePath = join(directory.path, 'roznamcha.db'); var cop = await f.copy(targetFilePath);
- 适配高版本Android权限(可选,针对Android 11+)
如果你需要将备份文件保存到外部存储公共目录,需要额外适配权限:
- 在
AndroidManifest.xml中添加MANAGE_EXTERNAL_STORAGE权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 权限请求逻辑中,Android 13以上替换
Permission.storage为Permission.manageExternalStorage。
- 修正方法返回值逻辑
当前代码无论备份是否成功最终都返回false,建议在备份完成后返回true,方便调用方判断执行结果:
if (await directory.exists()) { final pathdb = await getDatabasesPath(); final path = join(pathdb, 'roznamcha.db'); File f = File(path); final targetFilePath = join(directory.path, 'roznamcha.db'); var cop = await f.copy(targetFilePath); print('备份成功:$cop'); // 备份成功返回true return true; }
优化建议
如果不需要让用户在文件管理器中直接访问备份文件,推荐直接使用应用专属外部存储目录保存备份,不需要申请任何存储权限,兼容性更好,无需处理高版本权限适配问题。
内容的提问来源于stack exchange,提问作者maliha arash
相关产品推荐
相关产品推荐

