Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB2010]Estrarre un file zip
Forum - C# / VB.NET - [VB2010]Estrarre un file zip

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
DHD (Normal User)
Newbie


Messaggi: 14
Iscritto: 20/11/2013

Segnala al moderatore
Postato alle 23:48
Mercoledì, 20/11/2013
Salve a tutti, mi sono appena iscritto e non so molto di Visual Basic 2010.
Vorei sapere come si estrae un file zip da un programma.
Ho fatto un programma ( installer ) che dovrebbe installare un pacchetto mod in un gioco, Una volta scaricato, ho messo un pulsante Avanti che permette di passare al form successivo. In questo form, c'è un bottone ( installa ), al suo clic dovrebbe estrarre il file zip in C:\mods\ chiamato label4.text nella directory form1.textbox1.text
Ricordate che non so quasi nulla, quindi non rimandatemi al altre pagine, ma cercate di spiegarmi bene come fare.
Grazie a tutti

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 14:32
Giovedì, 21/11/2013
Ciao e benvenuto :k:
Per fare quello che chiedi hai bisogno di implementare una libreria, io ad esempio uso questa che è open source e facile da usare http://www.icsharpcode.net/opensource/sharpziplib/

PM Quote
Avatar
DHD (Normal User)
Newbie


Messaggi: 14
Iscritto: 20/11/2013

Segnala al moderatore
Postato alle 16:17
Giovedì, 21/11/2013
Testo quotato

Postato originariamente da GN:

Ciao e benvenuto :k:
Per fare quello che chiedi hai bisogno di implementare una libreria, io ad esempio uso questa che è open source e facile da usare http://www.icsharpcode.net/opensource/sharpziplib/



Ciao e grazie.
Alla fine sono riuscito ad implementare DotNetZip...

Ora vorrei creare un'updater che nell'evento Load del Form3, cerca nuovi aggiornamenti e se ci sono, scarica il nuovo setup.
Non riesco a capire come fare.

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 19:45
Giovedì, 21/11/2013
Dovresti implementare una parte lato server da hostare su un spazio web, per poter ottenere l'ultima versione: se si tratta di un progetto piccolo puoi anche usare un semplice file txt, altrimenti è meglio implementare un database con tutte le versioni e una pagina dinamica che restituisce la più recente. Dal tuo programma poi puoi utilizzare la classe webclient per fare una richiesta via http in modo da ottenere l'ultima versione, poi la confronti con la versione corrente e, se è più recente, scarichi lo zip (sempre con il webclient) e lo estrai.

PM Quote
Avatar
DHD (Normal User)
Newbie


Messaggi: 14
Iscritto: 20/11/2013

Segnala al moderatore
Postato alle 20:37
Giovedì, 21/11/2013
Testo quotato

Postato originariamente da GN:

Dovresti implementare una parte lato server da hostare su un spazio web, per poter ottenere l'ultima versione: se si tratta di un progetto piccolo puoi anche usare un semplice file txt, altrimenti è meglio implementare un database con tutte le versioni e una pagina dinamica che restituisce la più recente. Dal tuo programma poi puoi utilizzare la classe webclient per fare una richiesta via http in modo da ottenere l'ultima versione, poi la confronti con la versione corrente e, se è più recente, scarichi lo zip (sempre con il webclient) e lo estrai.



Grazie :hail::hail::hail::hail:
Sono riuscito a risolvere così:
nell'evento load del form3, ho messo che doveva confrontare la versione del txt e la versione del programma, se erano uguali allora continuava, altrimenti apriva un nuovo exe ( creando un nuovo progetto ) che cancellava il vecchio exe, scaricava quello nuovo e lo rimetteva dove si trovava.
Grazie :)

PM Quote
Avatar
DHD (Normal User)
Newbie


Messaggi: 14
Iscritto: 20/11/2013

Segnala al moderatore
Postato alle 23:19
Giovedì, 21/11/2013
Sempre riferito allo stesso argomento, vorrei che i dll si trovino nella risosa del programma e poterle utilizzare da li.
Sostanzialmente il problema è che nella cartella dove c'è l'exe ci devono essere anche i dll. Come posso aggiungere le dll alle risorse del programma e utilizzarle da lì ( tipo come le icone ) ?
Ho aggiungo le dll alle risorse però non le vede.
Grazie

:ot:
Per l'updater ecco i codici che ho usato nell'evento load del primo form:

Codice sorgente - presumibilmente VB.NET

  1. Dim richiesta As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://miositoaltervista/cartella/versione.txt")
  2.         Dim risposta As System.Net.HttpWebResponse = richiesta.GetResponse()
  3.         Dim LS As System.IO.StreamReader = New System.IO.StreamReader(risposta.GetResponseStream())
  4.         Dim nuovaversione As String = LS.ReadToEnd
  5.         If nuovaversione = My.Application.Info.Version.ToString Then
  6.  
  7.         ElseIf nuovaversione > My.Application.Info.Version.ToString Then
  8.             System.IO.File.CreateText(Application.StartupPath & "\update.updater")
  9.             Process.Start(Application.StartupPath & "\Updater.exe")
  10.             End
  11.         End If



e nel nuovo progetto:

Codice sorgente - presumibilmente VB.NET

  1. Imports System
  2. Imports System.IO
  3. Imports System.Net
  4. Public Class Form1
  5.  
  6.     Dim WithEvents downloader As WebClient
  7.  
  8.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.         Me.Hide()
  10.         If File.Exists(Application.StartupPath & "\update.updater") Then
  11.             System.IO.File.Delete(Application.StartupPath & "\Mod_pack.exe")
  12.             downloader.DownloadFileAsync(New Uri("http://miositoaltervista/cartella/Mod_Pack.exe"), Application.StartupPath & "\Mod_Pack.exe")
  13.         Else
  14.             MsgBox("Updater è un componente del Mod Pack.exe", MsgBoxStyle.Information, "Updater")
  15.             End
  16.         End If
  17.     End Sub
  18.  
  19.     Private Sub downloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles downloader.DownloadFileCompleted
  20.         MsgBox("Aggiornamento completato!", MsgBoxStyle.Information)
  21.         System.IO.File.Delete(Application.StartupPath & "\update.updater")
  22.         End
  23.     End Sub
  24. End Class



solo che se eseguo il programma, ( modpack.exe ), crea il file, apre l'updater e si chiude, mi dà un'errore. Eccp cosa c'è nella finestra di errore:
Codice sorgente - presumibilmente Delphi

  1. Le informazioni su come richiamare il debug JIT (Just-In-Time) anziché questa finestra
  2. sono riportate in fondo al messaggio.
  3.  
  4. ************** Testo dell'eccezione **************
  5. System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto.
  6.    in Updater.Form1.Form1_Load(Object sender, EventArgs e)
  7.    in System.EventHandler.Invoke(Object sender, EventArgs e)
  8.    in System.Windows.Forms.Form.OnLoad(EventArgs e)
  9.    in System.Windows.Forms.Form.OnCreateControl()
  10.    in System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
  11.    in System.Windows.Forms.Control.CreateControl()
  12.    in System.Windows.Forms.Control.WmShowWindow(Message& m)
  13.    in System.Windows.Forms.Control.WndProc(Message& m)
  14.    in System.Windows.Forms.ScrollableControl.WndProc(Message& m)
  15.    in System.Windows.Forms.ContainerControl.WndProc(Message& m)
  16.    in System.Windows.Forms.Form.WmShowWindow(Message& m)
  17.    in System.Windows.Forms.Form.WndProc(Message& m)
  18.    in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  19.    in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  20.    in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)



( non ho copiato tutti gli assembly )

Grazie ancora

Ultima modifica effettuata da DHD il 21/11/2013 alle 23:25
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 14:22
Venerdì, 22/11/2013
Non ho ben capito qual è il problema delle librerie, comunque quell'errore è dovuto al fatto che non hai inizializzato il webclient; sostituisci
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim WithEvents downloader As WebClient


con
Codice sorgente - presumibilmente VB.NET

  1. Dim WithEvents downloader As New WebClient


PM Quote
Avatar
DHD (Normal User)
Newbie


Messaggi: 14
Iscritto: 20/11/2013

Segnala al moderatore
Postato alle 17:06
Venerdì, 22/11/2013
Testo quotato

Postato originariamente da GN:

Non ho ben capito qual è il problema delle librerie, comunque quell'errore è dovuto al fatto che non hai inizializzato il webclient; sostituisci
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim WithEvents downloader As WebClient


con
Codice sorgente - presumibilmente VB.NET

  1. Dim WithEvents downloader As New WebClient




Grazie, sono riuscito a risolvere :)

Ora che però ho riprovato c'è qualcosa che non va:
Nel Form2 ci sono 2 Radiobutton. Nel 1° c'è il pacchetto meno "pesante", nel 2° c'è quello con le statistiche.
Andando avanti, nel Form successivo, il Form7, chiedo di selezionare se usare o meno il tasto shift.
Poi nel Form successivo, il Form1, deve scaricare il file selezionato nel radiobutton del form2, solo che qualsiasi opzione scelgo, delle 2, mi scarica(va la prima) la 2° opzione.
ecco il codice che scarica:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         'se la directory C:\mods non esiste
  3.         If My.Computer.FileSystem.DirectoryExists("C:\" & "mods\") = False Then
  4.             'allora la crea
  5.             MkDir("C:\mods")
  6.         End If
  7.         'imposta testo label5=0%
  8.         Label5.Text = "0%"
  9.         'se è stato selezionato il pacchetto lite in precedenza
  10.         ' lo scarica
  11.         If Form2.RadioButton1.Checked Then
  12.             Label4.Text = "Pacchetto_Lite.zip"
  13.             If My.Computer.FileSystem.FileExists("C:\mods\Pacchetto_Lite-1.0.zip") Then
  14.                 Label1.Text = "Pacchetto già scaricato!"
  15.                 MsgBox("Il pacchetto è già stato scaricato!", MsgBoxStyle.Information, "Già Scaricato")
  16.             Else
  17.                 download.DownloadFileAsync(New Uri("http://miosito.com/file.zip"), "C:\mods\Pacchetto_Lite-1.0.zip")
  18.             End If
  19.         Else
  20.             Label4.Text = "Pacchetto_Con_XVM.zip"
  21.             If My.Computer.FileSystem.FileExists("C:\mods\Pacchetto_Con_XVM-1.0.zip") Then
  22.                 Label1.Text = "Pacchetto già scaricato!"
  23.                 MsgBox("Il pacchetto è già stato scaricato!", MsgBoxStyle.Information, "Già Scaricato")
  24.             Else
  25.                 download.DownloadFileAsync(New Uri("http://miosito.com/file1.zip"), "C:\mods\Pacchetto_Con_XVM-1.0.zip")
  26.             End If
  27.         End If
  28.  
  29.     End Sub



come puoi vedere, nell'evento load del Form, deve richiamare i radiobutton del Form2, solo che non so per quale motivo mi scarica sempre la stessa cosa puravendo scelto un'opzione diversa...

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 20:51
Venerdì, 22/11/2013
Il problema è qui
Codice sorgente - presumibilmente C# / VB.NET

  1. If Form2.RadioButton1.Checked Then


Stai facendo riferimanto alla classe Form2 invece che all'istanza. Il valore booleano che indica cosa si deve scaricare divresti passarlo dal form dove ci sono i radiobutton al costruttore di quello che fa il download. In altre parole, dichiara nel form1 (quello di cui hai postato il codice del load) che prenda il parametro e lo assegni a una variabile goobale
Codice sorgente - presumibilmente VB.NET

  1. Dim Versione As Boolean
  2. Sub New (ByVal v As Boolean)
  3.   Versione = v
  4. End Sub


Poi sostuisci la riga di prima con
Codice sorgente - presumibilmente C# / VB.NET

  1. If versione Then


E nel form2, nel punto dove inizializzi il form1 ([ot]ti consiglierei di dare dei nomi più significativi a questi form, e anche ai controlli, perchè altrimenti ci si capisce poco[/ot]) passi il parametro corretto (ovvero radiobutton1.checked)

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo