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

获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:10:29