DotNetZip "замерзает" на время распаковки, но нужно передавать инфу для прогрессбара - C#

Узнай цену своей работы

Формулировка задачи:

Прошу помощи в том, как правильно выполнить распаковку с отображением хода процесса на прогрессбаре. Использую Ionic.Zip.dll (DotNetZip). Главный поток "замораживается" и я вижу сразу событие: Reading_Completed Я так понимаю, нужен некий асинхронный запуск. Может что в опциях еще нужно дописать - в доках это описано в разделе: References -> Ionic.zip Namespace -> Read Options Class Тестовый проект с библиотекой приложил.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using Ionic.Zip;

namespace ZipTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
            
        private void ReadProgress1(object sender, ReadProgressEventArgs e)
        {
            labelPerc.Text = e.EventType.ToString();
            //MessageBox.Show(e.EventType.ToString());
 
            switch (e.EventType)
            {
                case ZipProgressEventType.Reading_ArchiveBytesRead:
                    int percent = Convert.ToInt32(e.BytesTransferred / e.TotalBytesToTransfer * 100);
                    if (progressBar1.Value != percent)
                        progressBar1.Value = percent;
                        //labelPerc.Text = percent.ToString();
                    break;
                case ZipProgressEventType.Reading_Completed:
                    // Откроем целевую папку
                    break;
 
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            string FileNameFull = "D:\\temp\\MyJoe.zip";
            string FolderNameFull = "D:\\temp\\Joe";
 
            // Очищаем целевую папку
            if (Directory.Exists(FolderNameFull))
            {
                /*
                DirectoryInfo dirInfo = new DirectoryInfo(FolderNameFull);
                
                foreach (FileInfo fil in dirInfo.GetFiles()) // Не буду использовать - метод нерекурсивен, а файлы - глубже
                {
                    fil.Delete();
                }
                 */
                Directory.Delete(FolderNameFull,true); //true - если директория не пуста (удалит и файлы, и папки)
                Directory.CreateDirectory(FolderNameFull);
            }
            
            try
            {
                var options = new ReadOptions {
                    Encoding = Encoding.GetEncoding(866),
                    ReadProgress = ReadProgress1
                };
 
                using (ZipFile zip = ZipFile.Read(FileNameFull, options))
                {
                        // This call to ExtractAll() assumes:
                        //   - none of the entries are password-protected.
                        //   - want to extract all entries to current working directory
                        //   - none of the files in the zip already exist in the directory;
                        //     if they do, the method will throw.
                    zip.ExtractAll(FolderNameFull);
                }
 
                //Откроем целевую папку
                Process.Start(FolderNameFull);
 
            }
            catch (Exception ex)
            {
                    MessageBox.Show(ex.Source + "\n" + ex.Message);
            }
        }
    }
}
P.S. Оф. документация есть в файле и еще доп. по ссылке.

Решение задачи: «DotNetZip "замерзает" на время распаковки, но нужно передавать инфу для прогрессбара»

textual
Листинг программы
        private void ReadProgress1(object sender, ReadProgressEventArgs e)
        {
            Thread thread = new Thread(() => labelPerc.Invoke(new Action<Label>(l =>
                {
                    l.Text = e.EventType.ToString();
                } ) ) );
 
            thread.Start();
            thread.Abort();
            labelPerc.Text = e.EventType.ToString();
 
            switch (e.EventType)
            {
                case ZipProgressEventType.Reading_ArchiveBytesRead:
                    int percent = Convert.ToInt32(e.BytesTransferred / e.TotalBytesToTransfer * 100);
                    if (progressBar1.Value != percent)
                        progressBar1.Value = percent;
                break;
 
                case ZipProgressEventType.Reading_Completed:
                    // Откроем целевую папку
                    break;
 
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы