Système de Launcher avec Mise à Jour.

Signaler
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012
-
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012
-
Salut !
Alors voila, comme le dit le titre du Topic, je suis en train de faire un Launcher avec les MaJ automatiques.
J'ai donc réussis à faire la vérification pour savoir si des Mise à Jour étaient disponible ou pas, mais le soucis vient du téléchargement et de "l’installation" de cette dite mise à jour.
Donc pour le téléchargement des nouveautés, j'ai pensée à deux solutions :
- Télécharger un fichier .zip/.rar et décompresser l'archive ( L'archive contiendrais juste les fichiers à modifier, et les anciens seraient donc remplacé )
- Télécharger tout les fichiers contenus dans un répertoire spécial sur mon FTP, et les placés dans les répertoire adapté ( J'ai des fichiers dans un dossier "Ressource/Audio" et "Ressource/Graphics", bah une fois téléchargé ceux qui étaient dans Audio, serait placé dans le dossier Audio, et ceux du Graphics dans le dossier Graphics. J'suis pas sur d'être très clair ^^" )

Voila, donc je me demandais quel était la meilleure solution ?
Et comment la réaliser ?

Merci d'avance !
:)

19 réponses


Bonsoir,

Sers toi de la classe System.Net.WebClient et de sa méthodes DownloadFileAsync et de ses événements DownloadProgressChanged et DownloadFileCompleted.

Ou alors bien plus simple : My.Computer.Network.DownloadFile
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

En faite, pour le "My.Computer.Network.DownloadFile", j'l'utilise déjà pour télécharger mon fichier disant s'il y a besoin d'une MaJ.

Le soucis, c'est que les fichiers seront différents à chaque MaJ, et je ne peux donc me servir de cette commande directement. ( Ou alors un truc m'a échappé ^^" ).


J'vais essayer de voir les autres fonctions merci ^^.

Dans le fichier en question que tu télécharges, il te faut répertorier tous les fichiers sur lesquels une maj à été faite. Il te faut inclure 2 informations au minimum sur chaque ligne. L'adresse où télécharger le fichier et le dossier de destination sur la machine de l'utilisateur. (le poids du fichier serait souhaitable en plus si tu voulais visualiser la progression de l'avancement des téléchargemebnts).

A la lecture de ce fichier de référence, ligne par ligne (1 fichier mis à jour par ligne), tu devras extraire ces infos (si c'est du texte, tu peux utiliser un simple split pour séparer les infos sur ta ligne) et agir en conséquence.

Remarque : 1 seule information suffirait si tu agençait tes dossiers sur le site distant de la même façon que sur l'arborescence des dossiers de la machine de l'utilisateur. Ainsi, une partie de l'adresse de téléchargement servirait à placer le fichier au bon endroit chez l'utilisateur.
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Mmm ... Okay, ça me parait être une bonne idée.

Par contre, comment faire pour lire ligne par ligne, et selon ce qu'il y a sur la ligne, effectuer une action ?
Pour l'instant, j'ai fait ça :
Dim F As StreamReader = New StreamReader("Version.txt", IO.FileMode.Open)
        Dim ligne As String
        Dim last_ligne As String
        Do
            last_ligne = ligne
            ligne = F.ReadLine()
        Loop Until ligne Is Nothing

Etant donné que le fichier Version est quasiment vide, ça me gênait pas de le laisser comme ça.
Mais si je veux y rajouter des lignes pour les fichiers à DL, il me faudrait pouvoir différencier la première ligne et les autres. Comment faire ?

Après, oui sur mon Serveur je pensait effectuer ranger de la même façon que sur mon PC, histoire de bien m'y retrouver.
Et sinon, comment faire pour afficher l'avancement du téléchargement ?
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Bon, j'ai finalement réussis à faire la barre de progression de téléchargement avec :
 Private Sub Download_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim Client As WebClient = New WebClient
            AddHandler Client.DownloadProgressChanged, AddressOf client_ProgressChanged
            AddHandler Client.DownloadFileCompleted, AddressOf client_DownloadCompleted
            Client.DownloadFileAsync(New Uri("URL à Télécharger"), "Test.exe")
End Sub
    Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
        ProgressBar1.Value = e.ProgressPercentage
        Label1.Text = "Téléchargement de : . / " + e.ProgressPercentage.ToString + "%"
    End Sub


Mais je bloque toujours sur le téléchargement par ligne ...

( On peut pas éditer ses anciens messages ? )

Mais je bloque toujours sur le téléchargement par ligne ...

Le mieux est d'utiliser une collection premier entré, premier sorti et d'ajouter tes liens dedans lors de la lecture des lignes du fichier. Va voir du côté de System.Collections.Queue et de ses méthodes Enqueue, Dequeue, Peek
et surtout sa propriété Count (on télécharge pendant que Count > 0)
Tu peux aussi utiliser les List(Of ...

Sers toi, dans ta sub ProgressChanged, du maximum de e.ProgressPercentage pour lancer un nouveau téléchargement.

J'ai compris ton problème mais j'ai dû le deviner parce que ce n'était pas clair. Je suppose que tu as un numéro de version genre 0.37 sur la première ligne ?
Dans ce cas il te suffit de lire juste la première ligne avec f.readline avant de commencer ta boucle. Si la version est la même tu n'as pas besoin d'exécuter cette boucle (donc pas de téléchargement).
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Ouaip', c'est ça.
Finalement, j'ai réussis à diffèrencier la première ligne des autres de cette façon :
        Dim Nbr_Ligne As Integer
        Nbr_Ligne = 0
        Dim F As StreamReader = New StreamReader("Version.txt", IO.FileMode.Open)
        Dim ligne As String
        Nbr_Ligne = 0
        Do
            ligne = F.ReadLine()
            If Nbr_Ligne <> 0 Then

                MsgBox(ligne)
            End If

            Nbr_Ligne += 1
        Loop Until ligne Is Nothing


Et en faite, je bloque sur l'ajout des autres lignes dans un tableau ...
J'ai essayer de créer un tableau :
Public list_download As List(Of String)

Puis :
        Dim Nbr_Ligne As Integer
        Nbr_Ligne = 0
        Dim F As StreamReader = New StreamReader("Version.txt", IO.FileMode.Open)
        Dim ligne As String
        Nbr_Ligne = 0
        Do
            ligne = F.ReadLine()
            If Nbr_Ligne <> 0 Then
                list_download.Add(ligne)
                MsgBox(ligne)
            End If

            Nbr_Ligne += 1
        Loop Until ligne Is Nothing

Mais bizarrement, la boucle ne se fait jamais ...
Il saute tout dès qu'il arrive à la ligne :
list_download.Add(ligne)

Je comprend pas pourquoi ...



Après, je pensais modifier un peu client_DownloadCompleted qui est automatiquement appeler à la fin d'un téléchargement :

Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
        ' Je vérifie si le tableau est vide. 
        If list_download.Any Then
            ' S'il l'est pas, je retire la première ligne. ( Téléchargement déjà fait. )
            list_download.RemoveAt(0)
            ' Et je relance un téléchargement
        Else
            ' Je "ferme" la fenêtre quand tout les téléchargements sont finit.
            MessageBox.Show("Téléchargement Terminé !")
            ActiveForm.Close()
            Index.Show()
            Index.Enabled = True
            Index.Activate()
        End If
    End Sub


Ça devrait marcher non ?

Mais bizarrement, la boucle ne se fait jamais ...

1 - Relis ton code, tu t'apercevras que ta condition (if) est évitée au premier passage puisque nbr_ligne = 0, ce qui fait que ligne (as string) reste a Nothing, et comme tu ordonnes de sortir avec until, la boucle n'est jamais exécutée.

2 - list_download.Count aurait suffit..
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

1. En faite, si je retire la ligne "list_download.Add(ligne)" , tout se passe bien, la boucle s'effectue normalement et les messages apparaissent ... Mais dès que j'ai cette ligne, ça s'arrête avant d'afficher le premier message.
D'où mon incompréhension =/.
Sinon, je cherche à comparer ligne, qui est indépendant de Nbr_Ligne.
Du coup ligne est toujours différents de Nothing sauf à la fin.
Non ?

2. A la place de list_download.Any ?

1. Non ceci vient du fait que tu as mal déclaré ta List(Of, tu dois l'initialiser avec l'instruction New.

2. Fais comme tu as l'habitude de faire.

Qui qu'il en soit, ta boucle est hasardeuse puisqu'elle ne détecte pas la fin du fichier.
Tu devrais faire un truc du genre :
Dim list_download As New List(Of String)
Using reader As New IO.StreamReader("version.txt")
     Dim version As String = reader.ReadLine
     If version <> version_actuelle Then
        Do While Not reader.EndOfStream
           list_download.Add(reader.ReadLine)
        Loop
     End If
End Using
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Mmm ...

J'ai toujours un soucis avec cette liste ...
Pour l'instant j'ai fait ça :
Imports System
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.IO.File
Public Class FoA
    Public list_download As List(Of String) = New List(Of String)

    Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
        ProgressBar1.Value = e.ProgressPercentage
        Dim Name
        ' Si la liste est pas vide, je recupère le premier élément, je recupère juste la fin, et change mon label pour afficher le nom et le %age.
        ' Mais il me dit que la liste est toujours vide ( Rien ne change ).
        If list_download.Count <> 0 Then
            Name = Split(MsgBox(list_download.First), "http://caelondia.voila.net/")
            Label1.Text = "Téléchargement de : " + Name(1) + " / " + e.ProgressPercentage.ToString + "%"
        End If
    End Sub

    Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
        MsgBox(list_download.Count) 'Me renvoie 0.
        If list_download.Count <> 0 Then
            ' Si c'est pas vide, je relance le prochain DL.
            ' Il manque surement un truc pour retirer le premier élément de la liste, mais pour l'instant, le reste marche pas alors ...
            Dim Name
            Name = Split(list_download.First, "http://caelondia.voila.net/")
            Dim Client As WebClient = New WebClient
            AddHandler Client.DownloadProgressChanged, AddressOf client_ProgressChanged
            AddHandler Client.DownloadFileCompleted, AddressOf client_DownloadCompleted
            Client.DownloadFileAsync(New Uri(list_download.ElementAt(0)), Name(1))
        Else
            ' Affiche la fin du DL.
            MessageBox.Show("Téléchargement Terminé !")
        End If
    End Sub

    Private Sub Download_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Lorsque la fenêtre s'ouvre.
        Dim Name
        Dim n As String
        Dim Nbr_Ligne As Integer

        Nbr_Ligne = 0
        ' La boucle pour recupèrer les liens.
        Dim list_download As New List(Of String)
        Using reader As New IO.StreamReader("Version.txt")
            Dim version As String = reader.ReadLine
            Do While Not reader.EndOfStream
                n = reader.ReadLine
                list_download.Add(n)
                ' Ajoute le lien à la liste
            Loop
        End Using

        MsgBox(list_download.Count)
        ' Affiche bien 2.

        Name = Split(list_download.First, "http://caelondia.voila.net/")
        ' Recupère le nom du fichier.
        Dim Client As WebClient = New WebClient
        AddHandler Client.DownloadProgressChanged, AddressOf client_ProgressChanged
        AddHandler Client.DownloadFileCompleted, AddressOf client_DownloadCompleted
        Client.DownloadFileAsync(New Uri(list_download.First), Name(1))
        ' Lance le DL.

        MsgBox(list_download.Count)
        ' Retourne bien 2.
    End Sub
End Class


Voila, donc en faite, le premier coup, la liste marche très bien, j'arrive bien à DL le fichier "Tilesets.rar".
Mais après, impossible de télécharger les autres ...
Ma liste devient subitement vide ...
J'ai pensé que ça venait de "list_download.First", mais j'ai essayer de le remplacer par "list_download.ElementAt(0)", mais ça marche pas mieux ...

Est ce qu'un truc m'aurait échappé ?

Bonjour,

Tu as un conflit de déclaration de portée englobante dans ton code.
Dans Download_Load_1 tu redéclare ta liste: pourquoi ?
Dim list_download As New List(Of String)

Il te suffit de virer cette ligne.
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Ah ouais ...
Ça marche, merci beaucoup !

Enfin, j'ai quand même une dernière toute petite question :
J'ai fait que le code plus haut soit ouvert dans une autre form ( Download.vb ), dépendante de la première, pour plus de claireté.
Pour afficher la fenêtre, j'ai fait :
        ActiveForm.Enabled = False
        ' La fenêtre actuelle devient "inclicable"
        Download.Show()
        ' J'affiche la fenêtre de DL.

Et dans les paramètres de la fenêtre, j'ai mis "Show In Task Bar" à False.
Du coup, là fenêtre n’apparaît pas dans la barre des taches.
Mais le problème, c'est que si j'ouvre une fenêtre par dessus mon application ( Navigateur Web, Documents ... ) et que je clic sur mon appli dans la barre des taches ( L'appli de "base" ), bah, la fenêtre Download.vb reste caché ...

J'ai essayer des trucs du genre
    Private Sub Form2_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
        If ActiveForm.Enabled = False Then
            MsgBox("Aze")
            Download.Focus()
        End If
    End Sub


Je suppose que c'est parce que la fenêtre est désactivé ...

Comment faire pour régler ce petit problème ?

Doit-on pouvoir continuer à travailler sur le formulaire principal ou bien l'application doit rester 'verrouillée' pendant les mises à jour ?
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Non elle reste verrouillée ^^.

Pardon, j'avais pas lu la totalité de ton post.
Il te suffit de faire Download.ShowDialog() ainsi l'orsque tu cliqueras sur la barre des tâches, les deux fenêtres s'afficheront.
A+
Messages postés
10
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mai 2012

Effectivement, merci!