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

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

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

Author24 — интернет-сервис помощи студентам
Прошу помощи в том, как правильно выполнить распаковку с отображением хода процесса на прогрессбаре.
Использую 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2013, 03:46
Ответы с готовыми решениями:

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

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

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

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

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

1
660 / 530 / 137
Регистрация: 07.07.2011
Сообщений: 1,232
29.06.2013, 10:15 2

Не по теме:

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



Добавлено через 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
29.06.2013, 10:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2013, 10:15
Помогаю со студенческими работами здесь

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

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

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

Написание условия для заполнения прогрессбара
Здравствуйте я новичок в написании программ. Я для себя написал программу для заполнения данных...

[XE6] Как сделать заливку для прогрессбара?
В XE2 как то делал, а в xe6 не понимаю=(


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru