createFromFiles static method

Future<void> createFromFiles({
  1. required Directory sourceDir,
  2. required List<File> files,
  3. required File zipFile,
  4. bool includeBaseDirectory = false,
})

Compress given list of files and save the resulted archive to zipFile. sourceDir is the root directory of files (all files must reside under the sourceDir).

Set includeBaseDirectory to true to include the directory name from sourceDir at the root of the archive. Set includeBaseDirectory to false to include only the contents of the sourceDir.

Implementation

static Future<void> createFromFiles({
  required Directory sourceDir,
  required List<File> files,
  required File zipFile,
  bool includeBaseDirectory = false,
}) async {
  var sourceDirPath =
      includeBaseDirectory ? sourceDir.parent.path : sourceDir.path;
  if (!sourceDirPath.endsWith(Platform.pathSeparator)) {
    sourceDirPath += Platform.pathSeparator;
  }

  final sourceDirPathLen = sourceDirPath.length;

  final relativeFilePaths = <String>[];
  for (final f in files) {
    if (!f.path.startsWith(sourceDirPath)) {
      throw Exception('Files must reside under the rootDir');
    }
    final relativeFilePath = f.path.substring(sourceDirPathLen);
    assert(!relativeFilePath.startsWith(Platform.pathSeparator));
    relativeFilePaths.add(relativeFilePath);
  }
  await _channel.invokeMethod<void>('zipFiles', <String, dynamic>{
    'sourceDir': sourceDir.path,
    'files': relativeFilePaths,
    'zipFile': zipFile.path,
    'includeBaseDirectory': includeBaseDirectory
  });
}