Greatly improve installer performance (#994)

This commit is contained in:
2025-06-06 09:08:13 +02:00
parent 51edeae93a
commit 052bcaa29d
2 changed files with 23 additions and 19 deletions
+4 -3
View File
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
@@ -6,10 +6,11 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Platforms>AnyCPU;x86</Platforms>
<PublishSingleFile>True</PublishSingleFile>
<Self-Contained>True</Self-Contained>
<PublishReadyToRun>True</PublishReadyToRun>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
<PublishAot>true</PublishAot>
<StripSymbols>true</StripSymbols>
<Version>0.9.9.72</Version>
</PropertyGroup>
</Project>
+19 -16
View File
@@ -3,6 +3,8 @@ using System.Diagnostics;
using System.IO.Compression;
using System.Text;
var cts = new CancellationTokenSource();
static void RenderProgressBar(int currentStep, int totalSteps, int barSize)
{
Console.CursorLeft = 0; // Reset cursor position to the start of the line
@@ -34,8 +36,7 @@ if (File.Exists(updatePkg))
Console.WriteLine("Unpacking files...");
using var fileStream = new FileStream(updatePkg, FileMode.Open);
var sizeBuffer = new byte[4];
var copyBuffer = new byte[1024];
var copyBuffer = new Memory<byte>(new byte[4096]);
while (fileStream.Position < fileStream.Length - 1)
{
/*
@@ -48,32 +49,34 @@ if (File.Exists(updatePkg))
* Binary data
*/
await fileStream.ReadAsync(sizeBuffer, 0, 4);
var fileNameSize = BitConverter.ToInt32(sizeBuffer, 0);
var fileNameBuffer = new byte[fileNameSize];
await fileStream.ReadAsync(fileNameBuffer, 0, fileNameSize);
var fileName = Encoding.UTF8.GetString(fileNameBuffer);
var sizeBuffer = copyBuffer[..4];
await fileStream.ReadExactlyAsync(sizeBuffer);
var fileNameSize = BitConverter.ToInt32(sizeBuffer.Span);
var fileNameBuffer = copyBuffer[..fileNameSize];
await fileStream.ReadExactlyAsync(fileNameBuffer);
var fileName = Encoding.UTF8.GetString(fileNameBuffer.Span);
RenderProgressBar((int)fileStream.Position, (int)fileStream.Length, 40);
await fileStream.ReadAsync(sizeBuffer, 0, 4);
var relativePathSize = BitConverter.ToInt32(sizeBuffer, 0);
var relativePathBuffer = new byte[relativePathSize];
await fileStream.ReadAsync(relativePathBuffer, 0, relativePathSize);
var relativePath = Encoding.UTF8.GetString(relativePathBuffer);
await fileStream.ReadExactlyAsync(sizeBuffer);
var relativePathSize = BitConverter.ToInt32(sizeBuffer.Span);
var relativePathBuffer = copyBuffer[..relativePathSize];
await fileStream.ReadExactlyAsync(relativePathBuffer);
var relativePath = Encoding.UTF8.GetString(relativePathBuffer.Span);
RenderProgressBar((int)fileStream.Position, (int)fileStream.Length, 40);
await fileStream.ReadAsync(sizeBuffer, 0, 4);
var binarySize = BitConverter.ToInt32(sizeBuffer, 0);
await fileStream.ReadExactlyAsync(sizeBuffer);
var binarySize = BitConverter.ToInt32(sizeBuffer.Span);
var fileInfo = new FileInfo(relativePath);
fileInfo.Directory!.Create();
using var destinationStream = new FileStream(relativePath, FileMode.Create);
while(binarySize > 0)
{
var toRead = Math.Min(binarySize, copyBuffer.Length);
await fileStream.ReadAsync(copyBuffer, 0, toRead);
await destinationStream.WriteAsync(copyBuffer, 0, toRead);
var readBuffer = copyBuffer[..toRead];
await fileStream.ReadExactlyAsync(readBuffer);
await destinationStream.WriteAsync(readBuffer);
binarySize -= toRead;
RenderProgressBar((int)fileStream.Position, (int)fileStream.Length, 40);