Oppure

Loading
20/11/13 22:48
DHD
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
aaa
21/11/13 13:32
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 icsharpcode.net/opensource/sharpziplib/
aaa
21/11/13 15:17
DHD
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 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.
aaa
21/11/13 18:45
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.
aaa
21/11/13 19:37
DHD
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 :)
aaa
21/11/13 22:19
DHD
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:

        Dim richiesta As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://miositoaltervista/cartella/versione.txt")
        Dim risposta As System.Net.HttpWebResponse = richiesta.GetResponse()
        Dim LS As System.IO.StreamReader = New System.IO.StreamReader(risposta.GetResponseStream())
        Dim nuovaversione As String = LS.ReadToEnd
        If nuovaversione = My.Application.Info.Version.ToString Then

        ElseIf nuovaversione > My.Application.Info.Version.ToString Then
            System.IO.File.CreateText(Application.StartupPath & "\update.updater")
            Process.Start(Application.StartupPath & "\Updater.exe")
            End
        End If


e nel nuovo progetto:

Imports System
Imports System.IO
Imports System.Net
Public Class Form1

    Dim WithEvents downloader As WebClient

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Hide()
        If File.Exists(Application.StartupPath & "\update.updater") Then
            System.IO.File.Delete(Application.StartupPath & "\Mod_pack.exe")
            downloader.DownloadFileAsync(New Uri("http://miositoaltervista/cartella/Mod_Pack.exe"), Application.StartupPath & "\Mod_Pack.exe")
        Else
            MsgBox("Updater è un componente del Mod Pack.exe", MsgBoxStyle.Information, "Updater")
            End
        End If
    End Sub

    Private Sub downloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles downloader.DownloadFileCompleted
        MsgBox("Aggiornamento completato!", MsgBoxStyle.Information)
        System.IO.File.Delete(Application.StartupPath & "\update.updater")
        End
    End Sub
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:
Le informazioni su come richiamare il debug JIT (Just-In-Time) anziché questa finestra
sono riportate in fondo al messaggio.

************** Testo dell'eccezione **************
System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto.
   in Updater.Form1.Form1_Load(Object sender, EventArgs e)
   in System.EventHandler.Invoke(Object sender, EventArgs e)
   in System.Windows.Forms.Form.OnLoad(EventArgs e)
   in System.Windows.Forms.Form.OnCreateControl()
   in System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   in System.Windows.Forms.Control.CreateControl()
   in System.Windows.Forms.Control.WmShowWindow(Message& m)
   in System.Windows.Forms.Control.WndProc(Message& m)
   in System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   in System.Windows.Forms.ContainerControl.WndProc(Message& m)
   in System.Windows.Forms.Form.WmShowWindow(Message& m)
   in System.Windows.Forms.Form.WndProc(Message& m)
   in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   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 21/11/13 22:25
aaa
22/11/13 13:22
GN
Non ho ben capito qual è il problema delle librerie, comunque quell'errore è dovuto al fatto che non hai inizializzato il webclient; sostituisci
Dim WithEvents downloader As WebClient

con
 Dim WithEvents downloader As New WebClient
aaa
22/11/13 16:06
DHD
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
Dim WithEvents downloader As WebClient

con
 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:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'se la directory C:\mods non esiste
        If My.Computer.FileSystem.DirectoryExists("C:\" & "mods\") = False Then
            'allora la crea
            MkDir("C:\mods")
        End If
        'imposta testo label5=0%
        Label5.Text = "0%"
        'se è stato selezionato il pacchetto lite in precedenza
        ' lo scarica
        If Form2.RadioButton1.Checked Then
            Label4.Text = "Pacchetto_Lite.zip"
            If My.Computer.FileSystem.FileExists("C:\mods\Pacchetto_Lite-1.0.zip") Then
                Label1.Text = "Pacchetto già scaricato!"
                MsgBox("Il pacchetto è già stato scaricato!", MsgBoxStyle.Information, "Già Scaricato")
            Else
                download.DownloadFileAsync(New Uri("http://miosito.com/file.zip"), "C:\mods\Pacchetto_Lite-1.0.zip")
            End If
        Else
            Label4.Text = "Pacchetto_Con_XVM.zip"
            If My.Computer.FileSystem.FileExists("C:\mods\Pacchetto_Con_XVM-1.0.zip") Then
                Label1.Text = "Pacchetto già scaricato!"
                MsgBox("Il pacchetto è già stato scaricato!", MsgBoxStyle.Information, "Già Scaricato")
            Else
                download.DownloadFileAsync(New Uri("http://miosito.com/file1.zip"), "C:\mods\Pacchetto_Con_XVM-1.0.zip")
            End If
        End If

    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...
aaa