Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 5
.NET 4.x

DotNetZip - как сделать действие по факту завершения распаковки?

18.01.2015, 19:28. Показов 1907. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех.
Суть вопроса - в названии темы, но еще поясню. Имеется микро-программа, которая скачивает 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using Ionic.Zip;
using System.Threading;
 
namespace ISML_new_Updater
{
    public partial class Updater : Form
    {
        public Updater()
        {
            InitializeComponent();
        }
 
        //Функция загрузки файла (принимает ссылку и адрес аутпут)
        private void Download(string Uri, string Path)
        {
            GUPB.Minimum = 0;
            GUPB.Maximum = 100;
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += DownloadProgressChanged;
            webClient.DownloadFileCompleted += DownloadFileCompleted;
            webClient.DownloadFileAsync(new Uri(Uri), Path);
        }
 
        SynchronizationContext context;
 
        //Распаковка
        void ExtractAsync(string to, ZipFile zip)
        {
            zip.ExtractAll(to, ExtractExistingFileAction.OverwriteSilently);
            zip.Dispose();
        }
 
        //Прогресс распаковки
        void zip_ExtractProgress(object sender, ExtractProgressEventArgs e)
        {
            switch (e.EventType)
            {
                case ZipProgressEventType.Extracting_AfterExtractEntry:
                    if (context != null)
                        context.Send(
                            (o) =>
                            {
                                // --->
                                GUPB.Text = string.Format(
                                    "{0} из {1}",
                                    e.EntriesExtracted,
                                    e.EntriesTotal
                                    );
                                GUPB.Value = e.EntriesExtracted;
                                // <---
                            },
                            null
                            );
                    break;
            }
        }
 
        //Функция д/распаковки (принимает адрес архива и адрес аутпут)
        void ExtractZipFile(string ZipPath, string UnZipPath)
        {
            var zip = ZipFile.Read(ZipPath);
            zip.ExtractProgress += zip_ExtractProgress;
            GUPB.Maximum = zip.Count;
 
            context = SynchronizationContext.Current;
            new Thread(
                delegate()
                {
                    ExtractAsync(UnZipPath, zip);
                }).Start();
 
//Вот отсюда
            System.Diagnostics.Process MyProc = new System.Diagnostics.Process();
            MyProc.StartInfo.FileName = Application.StartupPath + @"/ISML.exe";
            try
            {
                MyProc.Start();
            }
            catch { }
            System.Diagnostics.Process.GetCurrentProcess().Kill();
//И до сюда, кусок кода должен выполняться ПОСЛЕ распаковки, а не сразу после ее начала. Можно убрать поток и прогрессбар вместе с ним, но не хочется.
        }
 
        //При изменении прогресса загрузки
        private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            GUPB.Value = Convert.ToInt16(e.ProgressPercentage);
        }
 
        //По завершению загрузки файла
        private void DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            ExtractZipFile(Application.StartupPath + @"/ISML.update", Application.StartupPath);
        }
 
        //Получение папки Program Files (x86)
        public static string ProgramFilesx86()
        {
            if (8 == IntPtr.Size
                || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
            {
                return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
            }
 
            return Environment.GetEnvironmentVariable("ProgramFiles");
        }
 
        private void Updater_Load(object sender, EventArgs e)
        {
            Download("http://indieservers.ru/isml/updates/ISML.zip", ProgramFilesx86() + @"\ISML\ISML.update");
        }
    }
}
Добавлено через 36 минут
Думаю нужно копать в сторону ZipProgressEventType.Extracting_AfterExt ractAll, но как это реализовать - не знаю, в шарпе не так давно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.01.2015, 19:28
Ответы с готовыми решениями:

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

Сделать одну кнопку, которая будет выполнять сначала действие первой кнопки, а затем действие второй
Здорова. Есть две кнопки, на которых по нажатию выполняются два скрипта: &lt;input type=&quot;image&quot;...

Как сделать событие завершения скачивания файла
Нужно сделать событие при завершении скачивания файла.

5
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.01.2015, 20:13
Iarvailor, нафига ты делаешь еще один поток, если можно просто в главном запустить?
C#
1
2
3
4
5
new Thread(
                delegate()
                {
                    ExtractAsync(UnZipPath, zip);
                }).Start();
это вообще ни к чему.
C#
1
2
3
4
5
6
7
8
9
10
11
        //Получение папки Program Files (x86)
        public static string ProgramFilesx86()
        {
            if (8 == IntPtr.Size
                || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
            {
                return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
            }
 
            return Environment.GetEnvironmentVariable("ProgramFiles");
        }
этот метод можно наменить одной строчкой:
C#
1
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.01.2015, 20:35
Цитата Сообщение от Psilon Посмотреть сообщение
это вообще ни к чему.
Там много что ни к чему... Используем класс Task и последовательно обрабатываем задачи.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
 
namespace ConsoleApplication8 {
    class Program {
        static void Main(string[] args) {
            Task<string>.Factory.StartNew(() => {
                //Распаковываем...
                Thread.Sleep(3000);
                //Возвращаем путь к распакованному файлу...
                return "PathToFile";
            })
            .ContinueWith(task => {
                //Получаем путь...
                string path = task.Result;               
                //Тут запускаем процесс...
                Thread.Sleep(3000);
            })
            .ContinueWith(task => {
                //Убиваем наш процесс...
                Process.GetCurrentProcess().Kill();
            });
            Console.ReadLine();
        }
    }
}
0
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 5
18.01.2015, 20:35  [ТС]
Psilon, и прогрессбар будет работать?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.01.2015, 20:40
insite2012, лучше бы уж await'ы
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.01.2015, 20:42
Цитата Сообщение от Psilon Посмотреть сообщение
лучше бы уж await'ы
У меня слабенький нетбук с MVS2010, а 2013 на большом. А поскольку на нетбуке мне писАть код удобнее, то только такой пример могу привести.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2015, 20:42
Помогаю со студенческими работами здесь

Как сделать следующее действие?
&quot;Если выбрано данное поле, то делай то-то &quot; Я делал такой код If Memo1.Selected then... If memo1.SelectedAll then... Но выдаёт...

Как сделать, чтобы вывод данных в форму происходил до завершения программы?
Как сделать, чтобы вывод данных в форму происходил до завершения программы? Есть маленькая програмка на C#, где после авторизации в...

Как сделать действие по нажатию клавиши?
from tkinter import * def script(): #действие w1 = Tk() w1.title(&quot;script&quot;) w1.geometry(&quot;500x500&quot;) btn = Button(w1) ...

Как сделать действие для UI Button?
Как сделать действие для UI Button, в unity 5 C#? public GameObject Button_name; ... if (Button_name) { } ...

Как исправить лаги программы и как сделать действие по кнопке на клавиатуре
1 Когда захожу в программу и нажимаю на кнопку старт программа просто вылетает как это можно исправить? 2 Как можно сделать бинд на окно...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru