Я пытаюсь создать метод в клиенте WPF, который загружает zip-файл из Azure и распаковывает его в папку.
Пока он отлично работает, но я хотел бы добавить возможностьчтобы показать прогресс в пользовательском интерфейсе и сделать его отменяемым в любое время.
Мне удалось сделать это с частью загрузки, но не с декомпрессией.
Я не оченьпозаботьтесь о том, чтобы мой файл был в формате zip или в любом другом формате.Я просто хочу отправить папки на Azure как отдельные файлы и как можно меньше.Я также хотел бы не платить сейчас за сжатие nuget-библиотек.
Вот что я сделал до сих пор:
public async Task Download()
{
if (!IsDownloading)
try
{
IsDownloading = true;
//Step 1: Check local presence
//TODO
State = CIState.Downloading;
StateTooltip = "Downloading";
//Step 2: Download from azure blob
var sasUri = await cloudTransferService.GetDownloadSasUri(GetCIType());
if (await cloudTransferService.BlobExists(CI.ID, sasUri))
{
cloudTransferService.OnProgressMade += CloudTransferService_OnProgressMade;
Cancelable = true;
await cloudTransferService.DownloadCIAsync(CI.ID, sasUri, Settings.Default.ProjectLocalPath, cancellationTokenSourceource);
Cancelable = false; //Disable cancel button as for now decompression cannot be cancelled
if(!canceled)
{
StateTooltip = $"Uncompressing content";
var path = await fileCompressionService.UncompressCI(Settings.Default.ProjectLocalPath + @"\" + CI.ID.ToString() + ".zip");
localStorageManagementService.DeleteFile(Settings.Default.ProjectLocalPath + @"\" + CI.ID.ToString() + ".zip");
StateTooltip = $"Done";
}
}
else
{
Cancelable = false;
State = CIState.Error;
StateTooltip = "No content found";
}
//step 3: Add to local library
//TODO
IsDownloading = false;
Cancelable = false;
}
catch (System.Threading.Tasks.TaskCanceledException)
{
IsDownloading = false;
State = CIState.AvailableToDownload;
Cancelable = false;
}
catch (System.Exception e)
{
Cancelable = false;
StateTooltip = "Error";
State = CIState.AvailableToDownload;
IsDownloading = false;
}
}
В службе сжатия файлов:
public async Task<string> UncompressCI(string zipFile)
{
try
{
var ProjectPath = Path.Combine(Path.GetDirectoryName(zipFile),Path.GetFileNameWithoutExtension(zipFile));
if (Directory.Exists(ProjectPath)) Directory.Delete(ProjectPath,true);
await Task.Run(() =>
{
try
{
ZipFile.ExtractToDirectory(zipFile,ProjectPath );
}
catch (Exception e)
{
//throw e;
}
}).ConfigureAwait(false);
if (!Directory.Exists(ProjectPath))
throw new Exception( "Cannot find the uncompressed folder");
return zipFile;
}
catch (Exception e)
{
throw e;
}
}