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

