extractArchive method

Future<Directory> extractArchive(
  1. File archiveFile, {
  2. String? targetDirName,
})

Extract archive to a directory

Implementation

Future<Directory> extractArchive(File archiveFile,
    {String? targetDirName}) async {
  if (!archiveFile.existsSync()) {
    throw WalletException('Archive file does not exist: ${archiveFile.path}');
  }

  final targetName =
      targetDirName ?? path.basenameWithoutExtension(archiveFile.path);
  final extractDir = await createTempDirectory('extract_$targetName');

  try {
    final bytes = await archiveFile.readAsBytes();
    final archive = ZipDecoder().decodeBytes(bytes);

    for (final file in archive) {
      final filename = path.join(extractDir.path, file.name);

      if (file.isFile) {
        final outputFile = File(filename);
        await outputFile.create(recursive: true);
        await outputFile.writeAsBytes(file.content as List<int>);
      } else {
        await Directory(filename).create(recursive: true);
      }
    }

    return extractDir;
  } catch (e) {
    await extractDir.delete(recursive: true);
    throw WalletException('Failed to extract archive: $e');
  }
}