Update nach Start

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von MB-Tech.

    Update nach Start

    Hey,

    Ich würde mein Programm gerne dazu bringen auf meinem Server nach Updates zu suchen...
    Das soll z.b.
    Änderungen (Neue Formen), My.Settings Updaten etc.

    Leider habe ich in diesem Fall keine Ahnung...
    Ich denke einige haben dies schon hingekriegt
    Fände es nett wenn sich jemand melden würde

    Schönen Abend noch
    Nein um mir ein paar Beispiele zu geben womit ich soetwas schaffen könnte...
    Ich habe das ja bisher nicht ausprobiert ;)

    Was muss ich denn machen auf dem Server? Eigentlich nur die Dateien bereit stellen oder?
    Höchstens noch zuweisen allerdings ließe sich das auch so machen...

    >> Nur melden um mir ein paar Beispiele oder Anstöße zu geben ;) <<
    ich würde es über ein PHP Skript machen, welches dir die Hashwerte aller Dateien überträgt, sollte ein Hash mit einer Datei auf dem lokalen Computer nicht mehr übereinstimmen, dann die Dateien herunterladen lassen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ja schon aber wie?
    Ich hatte das bisher immer so gedacht das die ganze .exe ersetzt werden muss! O.o

    Wie müsste das denn per PHP und Programm aussehen?
    Im Programm einfach per if richtig?

    p.s. ich lerne derzeit PHP bin aber erst auf seite 150 von 400 :D

    Viele Grüße
    ich habe PHP eigt. nur über das gelernt: tut.php-quake.net/de/ und das sind nicht sonderlich viele Seiten(der rest sind natürlich nur noch Befehle...)

    für die Serverseite ist es einfach nur der Befehl: php.net/manual/en/function.md5-file.php
    das ganze dann ausgeben(mit Dateienamen) und nach irgendeiner Logik getrennt...

    für die Clientseite(also den eigentlichen Updater):
    nonhostile.com/howto-calculate-md5-hash-file-vb-net.asp
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. ' specify the path to a file and this routine will calculate your hash
    2. Public Function MD5CalcFile(ByVal filepath As String) As String
    3. ' open file (as read-only)
    4. Using reader As New System.IO.FileStream(filepath, IO.FileMode.Open, IO.FileAccess.Read)
    5. Using md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
    6. ' hash contents of this stream
    7. Dim hash() As Byte = md5.ComputeHash(reader)
    8. ' return formatted hash
    9. Return ByteArrayToString(hash)
    10. End Using
    11. End Using
    12. End Function
    13. ' utility function to convert a byte array into a hex string
    14. Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
    15. Dim sb As New System.Text.StringBuilder(arrInput.Length * 2)
    16. For i As Integer = 0 To arrInput.Length - 1
    17. sb.Append(arrInput(i).ToString("X2"))
    18. Next
    19. Return sb.ToString().ToLower
    20. End Function


    Du sagtest das hier gehört auf die Client Seite...
    Aber da wird doch nirgend´s auf den Server hingewiesen oder?
    ja richtig, hab ich auch nie gesagt, das ist nur zum ermitteln des MD5 Hashs einer Datei(also die Gegenmethode in PHP zu md5_file), somit kannst du auf dem Computer sowie auf dem Server die hashes vergleichen...das aufrufen des PHP Skripts geht über den WebClient und DownloadString, alles andere ist ebenfalls noch dir überlassen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hey,

    es kommt darauf an wieviele Dateien dein Programm umfasst. Ist es nur eine Exe dann ist der Updatevorgang recht einfach.
    Habe dir hier mal ein Beispiel geschrieben (Wird auch in meinem Programm hier verwendet:


    Was man braucht

    Eine Windows Form mit einer Progressbar und einem Label.
    Progressbar.Style = Marquee
    Das ist jetzt für die Demo einfach. Wenn du es Detaliert mit einem Dateifortschritt haben willst, dann such im Forum. Gabs schon oft.

    Das könnte dann so aussehen:



    Diese Form wird einfach nur später mit FormName.ShowDialog() aufgerufen.

    Was du noch brauchst: Einen FTP Server mit einer Txt Datei mit der Zahl der neusten Version. In deinem Programm muss die Programmversion stehen.
    Ich verwende keine Kommas. Anstatt 1.1 schreibe ich 11 usw.

    Der Code

    VB.NET-Quellcode

    1. Private Sub menu_Update_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu_Update.Click
    2. '.:UPDATEVERSION:.
    3. Dim aktuelleVersion As Integer = 11
    4. Dim neueVersion As Integer = CInt(client.DownloadString("http://www.deinserver.ch/Server/Updates/Programm/update.txt"))
    5. If neueVersion > aktuelleVersion Then
    6. Dim result As MsgBoxResult = MessageBox.Show("Es ist ein Update verfügbar. Jetzt Laden?", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
    7. If result = MsgBoxResult.Yes Then
    8. UpdateWindow.Show()
    9. Me.Hide()
    10. client.DownloadFileAsync(New Uri("http://www.deinserver.ch/Server/Updates/Programm/Programm.exe"), My.Computer.FileSystem.SpecialDirectories.Temp & "\Programm.exe")
    11. Dim b() As Byte = My.Resources.updater
    12. File.WriteAllBytes(My.Computer.FileSystem.SpecialDirectories.Temp & "\updater.exe", b)
    13. Process.Start(My.Computer.FileSystem.SpecialDirectories.Temp & "\updater.exe")
    14. End
    15. End If
    16. Else
    17. MessageBox.Show("Es sind momentan keine Updates verfügbar.", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
    18. End If
    19. End Sub



    Ein externes Programm (updater.exe) kopiert und aktualisiert dann die exe.

    Dazu ist dieser Source:

    VB.NET-Quellcode

    1. 'Update der EXE
    2. 'Unsichtbar machen
    3. Me.Visible = False
    4. Me.Hide()
    5. Threading.Thread.Sleep(500)
    6. 'Datei austauschen
    7. My.Computer.FileSystem.DeleteFile(My.Application.Info.DirectoryPath & "\Programm.exe")
    8. My.Computer.FileSystem.CopyFile(My.Computer.FileSystem.SpecialDirectories.Temp & "\Programm.exe", My.Computer.FileSystem.SpecialDirectories.Temp & "\Programm.exe")
    9. My.Computer.FileSystem.DeleteFile(My.Computer.FileSystem.SpecialDirectories.Temp & "\WaveKeyBinder.exe")
    10. Dim writer As New StreamWriter(My.Computer.FileSystem.SpecialDirectories.Temp & "\temp.bat")
    11. writer.WriteLine("@echo off")
    12. writer.WriteLine("ping /n 1 localhost >nul")
    13. writer.WriteLine("cd " & My.Computer.FileSystem.SpecialDirectories.Temp & "\")
    14. writer.WriteLine("del update.exe")
    15. writer.WriteLine("msg * Update abgeschlossen!")
    16. writer.WriteLine("del temp.bat")
    17. writer.Close()
    18. Process.Start(My.Computer.FileSystem.SpecialDirectories.Temp & "\temp.bat")
    19. End


    Mit Hilfe einer Batchdatei wird dann die Updater Exe auch noch gelöscht. So verbleiben keine "Reste"


    Hoffe du blickst da durch :P

    Grüße