Files
tbd-station-14/SS14.Launcher/Helpers.cs
2019-07-29 23:19:10 +02:00

83 lines
2.8 KiB
C#

using System;
using System.Buffers;
using System.IO;
using System.IO.Compression;
using System.Net.Http;
using System.Threading.Tasks;
namespace SS14.Launcher
{
internal static class Helpers
{
public static void ExtractZipToDirectory(string directory, Stream zipStream)
{
using (var zipArchive = new ZipArchive(zipStream))
{
zipArchive.ExtractToDirectory(directory);
}
}
public static void ClearDirectory(string directory)
{
var dirInfo = new DirectoryInfo(directory);
foreach (var fileInfo in dirInfo.EnumerateFiles())
{
fileInfo.Delete();
}
foreach (var childDirInfo in dirInfo.EnumerateDirectories())
{
childDirInfo.Delete(true);
}
}
public static async Task DownloadToFile(this HttpClient client, Uri uri, string filePath,
Action<float> progress = null)
{
await Task.Run(async () =>
{
using (var response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
using (var contentStream = await response.Content.ReadAsStreamAsync())
using (var fileStream = File.OpenWrite(filePath))
{
var totalLength = response.Content.Headers.ContentLength;
if (totalLength.HasValue)
{
progress?.Invoke(0);
}
var totalRead = 0L;
var reads = 0L;
const int bufferLength = 8192;
var buffer = ArrayPool<byte>.Shared.Rent(bufferLength);
var isMoreToRead = true;
do
{
var read = await contentStream.ReadAsync(buffer, 0, bufferLength);
if (read == 0)
{
isMoreToRead = false;
}
else
{
await fileStream.WriteAsync(buffer, 0, read);
reads += 1;
totalRead += read;
if (totalLength.HasValue && reads % 20 == 0)
{
progress?.Invoke(totalRead / (float) totalLength.Value);
}
}
} while (isMoreToRead);
}
}
});
}
}
}