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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:01:22