mirror of
https://github.com/gwdevhub/Daybreak.git
synced 2026-09-14 04:19:24 +00:00
42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
using Daybreak.Shared.Services.SevenZip;
|
|
using Microsoft.Extensions.Logging;
|
|
using SevenZipExtractor;
|
|
using System.Core.Extensions;
|
|
using System.Extensions;
|
|
|
|
namespace Daybreak.Windows.Services.SevenZip;
|
|
|
|
internal sealed class SevenZipArchiveExtractor(
|
|
ILogger<SevenZipArchiveExtractor> logger) : ISevenZipExtractor
|
|
{
|
|
private readonly ILogger<SevenZipArchiveExtractor> logger = logger.ThrowIfNull();
|
|
|
|
public async Task<bool> ExtractToDirectory(string sourceFile, string destinationDirectory, Action<double, string> progressTracker, CancellationToken cancellationToken)
|
|
{
|
|
var scopedLogger = this.logger.CreateScopedLogger(nameof(this.ExtractToDirectory), sourceFile);
|
|
|
|
try
|
|
{
|
|
var root = Path.GetFullPath(destinationDirectory);
|
|
using var archive = new ArchiveFile(sourceFile);
|
|
var total = archive.Entries.Count;
|
|
var processed = 0;
|
|
await Task.Factory.StartNew(() =>
|
|
{
|
|
archive.Extract(entry =>
|
|
{
|
|
progressTracker((double)processed / total, entry.FileName);
|
|
processed++;
|
|
return Path.Combine(root, entry.FileName);
|
|
});
|
|
}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
scopedLogger.LogError(ex, "Failed to extract archive {SourceFile} to {DestinationDirectory}", sourceFile, destinationDirectory);
|
|
return false;
|
|
}
|
|
}
|
|
}
|