extractArchiveToDisk function
Future<void>
extractArchiveToDisk(
})
Implementation
Future<void> extractArchiveToDisk(Archive archive, String outputPath,
{int? bufferSize}) async {
final futures = <Future<void>>[];
final outDir = Directory(outputPath);
if (!outDir.existsSync()) {
outDir.createSync(recursive: true);
}
for (final entry in archive) {
final filePath = path.normalize(path.join(outputPath, entry.name));
if ((entry.isDirectory && !entry.isSymbolicLink) ||
!_isWithinOutputPath(outputPath, filePath)) {
continue;
}
if (entry.isSymbolicLink) {
if (!_isValidSymLink(outputPath, entry)) {
continue;
}
final link = Link(filePath);
await link.create(path.normalize(entry.symbolicLink ?? ""),
recursive: true);
continue;
}
if (entry.isDirectory) {
await Directory(filePath).create(recursive: true);
continue;
}
ArchiveFile file = entry;
bufferSize ??= OutputFileStream.kDefaultBufferSize;
final fileSize = file.size;
final fileBufferSize = fileSize < bufferSize ? fileSize : bufferSize;
final output = OutputFileStream(filePath, bufferSize: fileBufferSize);
try {
file.writeContent(output);
} catch (err) {
//
}
await output.close();
}
if (futures.isNotEmpty) {
await Future.wait(futures);
futures.clear();
}
}