获取PDF文件列表后转ZIP遇Exception: Files must reside under the rootDir问题求助
解决"Exception: Files must reside under the rootDir"异常
问题根源
- 你硬编码了
sourceDir为"source_dir",但实际要压缩的PDF文件并不在这个目录下。ZipFile.createFromFiles要求所有待压缩文件必须处于sourceDir指定的目录范围内,否则会触发该异常。 - 代码里的
files数组是写死的测试文件,不是你实际获取到的PDF文件列表中的目标文件。
修正后的代码
ListTile( title: Text(files[index].path), leading: Icon(Icons.folder_zip_outlined), onTap: () async { // 获取选中的PDF文件 final targetFile = files[index]; // 用该文件的父目录作为sourceDir final sourceDir = targetFile.parent; // 待压缩文件列表就是选中的这个文件 final filesToZip = [targetFile]; try { // 确保zip输出目录存在 final zipDir = Directory("storage/emulated/0/zip"); if (!await zipDir.exists()) { await zipDir.create(recursive: true); } // 生成zip文件路径 final zipFileName = "${targetFile.path.split('/').last}.zip"; final zipFile = File("${zipDir.path}/$zipFileName"); await ZipFile.createFromFiles( sourceDir: sourceDir, files: filesToZip, zipFile: zipFile, ); // 这里可以添加压缩成功后的提示逻辑 } catch (e) { print(e); } }, )
关键修改说明
- 直接用选中文件的父目录作为
sourceDir,确保待压缩文件在sourceDir范围内 - 待压缩文件列表替换为用户实际选中的PDF文件
- 增加了检查并创建zip输出目录的逻辑,避免因目录不存在导致的写入失败
- 使用
await处理异步文件操作,保证操作顺序正确
内容的提问来源于stack exchange,提问作者Faizan Abbas Bangash
相关产品推荐
相关产品推荐

