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

Flutter应用用archive包解压网络Zip文件遇OS Error 21求解决

Flutter解压Zip时OS Error 21的解决方法

OS Error 21对应Is a directory错误,核心原因是代码中误将目录路径当作文件路径操作,以下是具体排查和解决方向:

1. 检查下载路径是否正确

下载Zip文件时必须指定具体文件名,不能直接用目录路径:

// 错误写法:仅指定目录
final savePath = (await getTemporaryDirectory()).path;
// 正确写法:拼接具体文件名
final savePath = '${(await getTemporaryDirectory()).path}/target.zip';

若下载时只指定目录,系统会把下载内容当作目录处理,后续解压必然报错。

2. 修正解压逻辑的路径处理

使用archive包解压时,需注意两点:

  • 确保读取的是Zip文件的字节流,而非目录
  • 写入文件前,为每个压缩文件创建对应的父目录,避免将文件写入已存在的目录中

示例正确解压代码:

final zipFile = File('path/to/your/downloaded.zip');
final bytes = zipFile.readAsBytesSync();
final archive = ZipDecoder().decodeBuffer(InputBuffer(bytes));

final targetDir = await getApplicationDocumentsDirectory();
for (final file in archive.files) {
  if (file.isFile) {
    final filePath = '${targetDir.path}/${file.name}';
    // 递归创建父目录
    await Directory(filePath.substring(0, filePath.lastIndexOf('/'))).create(recursive: true);
    // 写入文件内容
    await File(filePath).writeAsBytes(file.content);
  }
}

3. 排查平台权限与目录访问问题

针对Android/iOS平台,确保应用有权限访问目标目录:

  • Android:直接使用path_provider获取的应用私有目录(无需额外权限),若需访问公共目录,需在AndroidManifest.xml中添加对应权限
  • iOS:若访问文档目录,需在Info.plist中配置NSDocumentsDirectoryUsageDescription

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 12:51:36