Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

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

29.06.2013, 03:46. Показов 1115. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи в том, как правильно выполнить распаковку с отображением хода процесса на прогрессбаре.
Использую Ionic.Zip.dll (DotNetZip).

Главный поток "замораживается" и я вижу сразу событие: Reading_Completed
Я так понимаю, нужен некий асинхронный запуск.
Может что в опциях еще нужно дописать - в доках это описано в разделе:
References -> Ionic.zip Namespace -> Read Options Class

Тестовый проект с библиотекой приложил.

Текущий код. Нужно только создать zip архив

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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. Оф. документация есть в файле и еще доп. по ссылке.
Вложения
Тип файла: zip ZipTest.zip (320.5 Кб, 7 просмотров)
Тип файла: zip DotNetZip-Documentation-v1.9.zip (5.27 Мб, 5 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2013, 03:46
Ответы с готовыми решениями:

DotNetZip - как сделать действие по факту завершения распаковки?
Приветствую всех. Суть вопроса - в названии темы, но еще поясню. Имеется микро-программа, которая скачивает zip с обновлением и должна...

Какие параметры нужно передавать для подключения к БД?
Имеем обычную функцию для подключения к БД def DBConnect(ip,usr,passw,db): try: print("Идет подключение к Базе...

SFX + запуск CMD во время распаковки
Ребят, все ломаюсь и не как не нахожу нужной инфы задача вроде проста: есть WinRAR (использую его так как он может хранить данные в...

1
 Аватар для Дмитрий3241
660 / 530 / 137
Регистрация: 07.07.2011
Сообщений: 1,232
Записей в блоге: 6
29.06.2013, 10:15

Не по теме:

Фигню написал



Добавлено через 19 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        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;
 
            }
        }
Работает, но это точно не так, как надо. Да и спрашивать меня как это работает то же не стоит.
Если найдешь нормальное решение то отпиши в тему, хочу посмотреть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2013, 10:15
Помогаю со студенческими работами здесь

E.ProgressPercentage + decimal и возможно ли вывести примерное время распаковки Ionic_Zip.dll
Здравствуйте, прошу подсказать возможно ли выводить процент более точно, в десятичных т.е. 89,9% и возможно ли вывести примерное время...

Asus 5560 переустановка windows - во время распаковки файлов села батарея...
Помогите, подскажите пожалуйста. При переустановки windows, вовремя распаковки файлов села батарея и после того когда включаешь ноут...

Нужно сделать так чтобы парсер собирал инфу не только с 1 страницы ,а и со всех остальных ,что нужно исправить ?
import logging import collections import csv import requests import bs4 logging.basicConfig(level=logging.DEBUG) logger =...

Как загружать DLL-ки, используемые в моем приложении, без распаковки их во время запуска?
Привет! Для безопасности я не должен использовать какие-либо временные файлы, а только сам .exe. DLL-ки должны быть «вмонтированы» в...

Посоветуйте плагин для прогрессбара картинок
Добрый день. Загружается страница с картинками. Пока грузятся картинки, вместо каждой из них должен автоматически появляться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru