2014-11-08 3 views
-1

Так что я много раз пытался много проб и ошибок, и я не могу заставить это работать, в основном я хочу разархивировать zip-файл с помощью Ionic.DLL от http://dotnetzip.codeplex.com, как вы можете видеть, я также рассказал об этом здесь: Extract ZipFile Using C# With Progress Report, поэтому в основном подытожим то, что мне нужно.C# Фоновый работник с zipfile (Ionic.dll)

У меня есть форма с: 3xbuttons: btnCancel, btnBrowse и btnStart, 1xbackground работник: backgroundworker1 1xlabel: Label1 1xtextbox: textBox1 1xprogressbar

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Threading; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using Ionic.Zip; 

namespace BackgroundWorkerSample 
{ 
    public partial class Form1 : Form 
    { 
     /// <summary> 
     /// The backgroundworker object on which the time consuming operation shall be executed 
     /// </summary> 
     BackgroundWorker m_oWorker; 

     public Form1() 
     { 
      InitializeComponent(); 
      m_oWorker = new BackgroundWorker(); 
      m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork); 
      m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged); 
      m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted); 
      m_oWorker.WorkerReportsProgress = true; 
      m_oWorker.WorkerSupportsCancellation = true; 
     } 

     /// <summary> 
     /// On completed do the appropriate task 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     void m_oWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      //If it was cancelled midway 
      if (e.Cancelled) 
      { 
       lblStatus.Text = "Task Cancelled."; 
      } 
      else if (e.Error != null) 
      { 
       lblStatus.Text = "Error while performing background operation."; 
      } 
      else 
      { 
       lblStatus.Text = "Task Completed..."; 
      } 
      btnStartAsyncOperation.Enabled = true; 
      btnCancel.Enabled = false; 
     } 

     /// <summary> 
     /// Notification is performed here to the progress bar 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      //Here you play with the main UI thread 
      progressBar1.Value = e.ProgressPercentage; 
      lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%"; 
     } 

     /// <summary> 
     /// Time consuming operations go here </br> 
     /// i.e. Database operations,Reporting 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     void m_oWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      //NOTE : Never play with the UI thread here... 

      //time consuming operation 
      for (int i = 0; i < 100; i++) 
      { 
       Thread.Sleep(100); 
       m_oWorker.ReportProgress(i); 



       /////////////////////MINEEEEEEEEEEEEEEEEEEEEEEEEE 
       string INSTALL_LOCATION = "C:" + @"\" + "Program Files (x86)" + @"\" + "TEST_FOLDER" + @"\" + @"\" + "Burgos_Folder"; 
       string DEFAULT_LOCATION = "C:" + @"\" + "Program Files (x86)" + @"\" + "TEST_FOLDER" + @"\" + "test.rar"; 

       if (!Directory.Exists(INSTALL_LOCATION)) 
       { 
        Directory.CreateDirectory(INSTALL_LOCATION); 
       } 

       //if the textbox directory exists 
       if (Directory.Exists(INSTALL_LOCATION)) 
       { 
        using (ZipFile zip = ZipFile.Read(DEFAULT_LOCATION)) 
          { 
           zip.ExtractAll(INSTALL_LOCATION, ExtractExistingFileAction.OverwriteSilently); 
          } 
       } 

       //If cancel button was pressed while the execution is in progress 
       //Change the state from cancellation ---> cancel'ed 
       if (m_oWorker.CancellationPending) 
       { 
        e.Cancel = true; 
        m_oWorker.ReportProgress(0); 
        return; 
       } 

      } 

      //Report 100% completion on operation completed 
      m_oWorker.ReportProgress(100); 
     } 

     private void btnStartAsyncOperation_Click(object sender, EventArgs e) 
     { 
      btnStartAsyncOperation.Enabled = false; 
      btnCancel.Enabled    = true; 
      //Start the async operation here 
      m_oWorker.RunWorkerAsync(); 
     } 

     private void btnCancel_Click(object sender, EventArgs e) 
     { 
      if (m_oWorker.IsBusy) 
      { 
       //Stop/Cancel the async operation here 
       m_oWorker.CancelAsync(); 
      } 
     } 
    } 
} 

Что я хотел бы мои WinForms иметь это просто: найдите папку, затем нажмите «Пуск» (btnStart), который запустит процесс извлечения zip, который также отображается на ProgressBar (timewise), а кнопка cancel (btnCancel) отменяет процесс распаковки, я успешно сделал все, но я не могу отработать, как отменить рассылку ss, он никогда не останавливается, если я фактически не закрываю .exe. Я решил сделать более простой пример без кнопки textbox и browse, и этот пример находится в моем предыдущем заданном вопросе (ссылка выше), но я не вижу, как реализовать способ отмены процесса распаковки с фоновым рабочим и я определенно должен использовать фонового работника, чтобы у меня был отчет о ходе текущей ситуации и т. д. Может ли кто-нибудь приспособить мои примеры или предоставить пример, который это делает?

+0

Адаптировать, какие примеры? Вы должны опубликовать хороший пример кода с этим вопросом. См. Http://stackoverflow.com/help/mcve. Тем временем убедитесь, что вы используете событие 'ProgressChanged' и установили' WorkerReportsProgress' в 'true'. –

+0

Вы уже знаете об ExtractProgressEventArgs, у него есть свойство Cancel. Так что это не займет ничего, кроме простого e.Cancel = backgroundWorker1.CancellationPending; –

+0

Я добавил, что мои нынешние ребята из примера, мне было достаточно ссылки на мой другой вопрос с примером. – Burgo855

ответ

0

Я нашел решение, я отошел от Иона и добавил существующие ссылки: System.IO.Compression и System.IO.Compression.FileSystem.

Смежные вопросы