C # WPF, распаковка асинхронной папки с поддержкой отмены и прогрессом - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь создать метод в клиенте 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;
        }
    }

1 Ответ

0 голосов
/ 20 ноября 2018

Реализация API должна сообщать о своем прогрессе вызывающей стороне и поддерживать отмену, чтобы вы могли отслеживать его прогресс и отменять его.Метод ZipFile.ExtractToDirectory не делает ни того, ни другого.

После вызова метода вы не можете отменить операцию, и вы точно не знаете, сколько времени потребуется для ее завершения.

Лучшее, что вы можете сделать, это отобразить промежуточное значение (установите IsIntermediate на true) ProgressBar в течение времени, которое требуется для сжатия файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...