【问题标题】:Exception: Files must reside under the rootDir例外:文件必须位于 rootDir 下
【发布时间】:2023-01-15 17:08:31
【问题描述】:

我想在获取 pdf 文件列表后将我的文件转换为 .zip 文件,但显示异常:文件必须位于 rootDir 下

ListTile(
                    title: Text(files[index].path),
                    leading: Icon(Icons.folder_zip_outlined),
                    //   trailing: Icon(Icons.play_arrow, color: Colors.redAccent,),
                    onTap: (){
                      final sourceDir = Directory("source_dir");
                      final files = [
                        File(sourceDir.path + "file1"),
                        File(sourceDir.path + "file2")
                      ];
                      try {
                        final zipFile = File("storage/emulated/0/zip/${files[index].path.split('/').last}.zip");

                        ZipFile.createFromFiles(
                            sourceDir: sourceDir, files: files, zipFile: zipFile);
                      } catch (e) {
                        print(e);
                      }
                      // you can add Play/push code over here
                    },
                  )

【问题讨论】:

    标签: flutter entity-framework dart flutter-layout flutter-dependencies


    【解决方案1】:

    我遇到了同样的问题,这是我的解决方案:

    • 您必须将所需文件复制到应用程序的根目录
    • 然后您必须将这个新的文件列表传递给 zip 函数

    我创建了一个文件实用程序类,可帮助我将文件移动到根目录:

    import 'dart:io';
    import 'package:path/path.dart' as p;
    
    class FileUtil {
      static Future<List<File>> copyFilesToRootDirectory(
          List<File> files, String newPath) async {
        List<File> newFilesList = [];
        files.forEach((file) async {
          newFilesList.add(await copyFileToRootDirectory(file, newPath));
        });
        return newFilesList;
      }
    
      static Future<File> copyFileToRootDirectory(File file, String newPath) async {
        String finalPath = "$newPath/${getFileNameAndType(file)}";
        if (file.path == finalPath) {
          //file already in this path
          return file;
        }
        return await file.copy(finalPath);
      }
    
      static String getFileNameAndType(File file) {
        return file.path.split("/").last;
      }
    }

    在 Looger Util 类中,我创建了这个函数:

      static Future<File?> zipFiles() async {
        final appDir = await getApplicationDocumentsDirectory();
        final String dbPath = p.join(appDir.path, 'kidlingTeacher.db').toString();
        final List<File> files = [File(dbPath), await FLog.exportLogs()];
        final List<File> filesInRootDir =
            await FileUtil.copyFilesToRootDirectory(files, appDir.path);
        final zipFile = File(p.join(appDir.path.toString(),
            "DIAGNOSTICS-${await getDeviceUUID()} - ${DateTime.now().toUtc().toString()}.zip"));
        try {
          await ZipFile.createFromFiles(
              sourceDir: appDir, files: filesInRootDir, zipFile: zipFile);
          return zipFile;
        } catch (e, s) {
          LoggerUtil.logError(
              text: "zip file process failed",
              className: "logger util",
              methodName: "zipFiles",
              exception: e as Exception,
              stackTrace: s);
        }
        return null;
      }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-16
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多