Dart应用压缩文件夹报错:无法创建文件(只读文件系统)
解决压缩文件夹时的FileSystemException: Read-only file system错误
问题原因
你调用zipDirectory时直接指定filename: 'out.zip',未提供完整可写路径,系统默认尝试将文件写入应用的只读安装目录,因此触发权限异常。
解决方案
需将压缩文件输出到应用有权限读写的目录(如应用文档目录、外部存储Download文件夹),具体实现如下:
1. 添加必要依赖
在pubspec.yaml中添加路径处理和权限相关依赖(按需选择):
dependencies: path_provider: ^2.0.15 # 获取应用可读写目录 path: ^1.8.3 # 路径拼接工具 permission_handler: ^10.2.0 # 读写外部存储时需要
2. 修改压缩代码(输出到应用文档目录)
应用文档目录由系统保证可读写,无需额外权限:
import 'dart:io'; import 'package:archive/archive_io.dart'; import 'package:send_data_with_wifi/variable/client.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; // 改为异步函数,因需异步获取目录 Future<void> createZip() async { // 获取应用文档目录 Directory appDocDir = await getApplicationDocumentsDirectory(); // 拼接完整zip文件路径 String zipOutputPath = path.join(appDocDir.path, 'out.zip'); var encoder = ZipFileEncoder(); encoder.zipDirectory( Directory(ClientVariable.filePath), filename: zipOutputPath, ); print('压缩文件已保存至: ${encoder.zipPath}'); }
3. (可选)输出到外部存储Download文件夹
若需保存到手机公共Download目录,需先申请存储权限:
import 'dart:io'; import 'package:archive/archive_io.dart'; import 'package:send_data_with_wifi/variable/client.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; import 'package:permission_handler/permission_handler.dart'; Future<void> createZipToDownload() async { // 申请存储权限 var status = await Permission.storage.request(); if (!status.isGranted) { print('存储权限未授予,无法保存到Download目录'); return; } // 获取Download目录 List<Directory>? downloadDirs = await getExternalStorageDirectories(type: StorageDirectory.downloads); if (downloadDirs == null || downloadDirs.isEmpty) { print('无法获取Download目录'); return; } String zipOutputPath = path.join(downloadDirs.first.path, 'out.zip'); var encoder = ZipFileEncoder(); encoder.zipDirectory( Directory(ClientVariable.filePath), filename: zipOutputPath, ); print('压缩文件已保存至Download目录: ${encoder.zipPath}'); }
关键说明
- 禁止使用相对路径,必须指定完整的可写路径
- 应用文档目录适合保存应用内部数据,无需额外权限
- 外部公共目录需申请存储权限,不同Android版本权限逻辑有差异,需适配
内容的提问来源于stack exchange,提问作者Mr.Nima
相关产品推荐
相关产品推荐

