VB.NET 2010: Datei-Löschen/Verschieben NACH dem Schließen der Form durchführen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von CR_ZOPF.

    VB.NET 2010: Datei-Löschen/Verschieben NACH dem Schließen der Form durchführen

    Hallo Alle zusammen,

    Des Öfteren besuche ich euch hier im Paradies und will sagen, Super eure Untersützung, die ihr den Neulingen hier zukommen lasst.

    Nach der Beweihräucherung nun zu meinem Problem :P :

    Ich möchte, wenn ich die Form über meinen Close-Button beende ANSCHLIEßEND eine Datei ersetzten. nämlich die, des Programms, welches ich ausführe. Also die Form selber im Endeffekt.

    Währen diese noch geöffnet ist, klappt das natürlich nicht ( oder? )

    Hintergrund ist, dass in dem Programm eine Updatefunktion eingebaut ist. Diese läuft auch ohne Probleme.

    Dann habe ich folgendes versucht:

    VB.NET-Quellcode

    1. #Region "Exit"
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Me.Close()
    4. End Sub
    5. 'Und hier bringt er den Fehler, dass keine Berechtigung da ist.
    6. 'Eigentlich hatte ich das so verstanden, dass "FormClosingEventArgs) Handles Me.FormClosing" heißt, NACH dem schließen der Form, aber er läuft immer direkt rein
    7. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    8. IO.File.Delete(Application.StartupPath & "\Dateiname.exe")
    9. IO.File.Move(Application.StartupPath & "\Products\unsupported\tools\Dateiname.exe", Application.StartupPath & "\Dateiname.exe")
    10. End Sub
    11. #End Region


    Habt ihr einen Ansatz für mich?

    Viele Grüße !!!!

    CR_Zopf
    Also ich glaube es gibt ein Event, wenn die From schon geschlossen ist.
    Da du das "Me.FormClosing" genommen hast, wird der COde ja ausgeführt, wenn es gerade geschlossen wird.
    Probier mal ein anderes, wie "Me.Closed" oder ähnliches.

    CR_ZOPF schrieb:

    Habt ihr einen Ansatz für mich?

    Lager den Updater in ein Extra-Programm aus den Du mit Process.Start aus Deinem Mainprogramm heraus startest. Danach beendet der Updater alle laufenden Instanzen Deines Main (alternativ: wartet bis Dein Main sich selbst beendet hat) und schreibt die neue Programmversion.

    Der Updater kann ja durchaus aus Deinen Respourcen gespeichert sein und dann bei Bedarf als temporäre Assembly in das Anwendungsverzeichnis geschrieben werden.
    Also ich glaube es gibt ein Event, wenn die From schon geschlossen ist.Da du das "Me.FormClosing" genommen hast, wird der COde ja ausgeführt, wenn es gerade geschlossen wird.Probier mal ein anderes, wie "Me.Closed" oder ähnliches.
    Werde ich morgen mal ausprobieren. Die Lösung wäre am besten. Ich habe nur eine form/exe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „CR_ZOPF“ ()

    Du kannst dein Problem mit einem Batch Skript lösen.

    Dazu erstellst du beim Beenden deines Projekts eine Batchdatei, in welcher du deine aktuelle .exe löschen und die neue in den Ordner kopieren lässt.

    Hier ein Code der funktionieren sollte:

    VB.NET-Quellcode

    1. Private Sub MyApplication_Shutdown(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Shutdown
    2. Dim exePath As String = Environment.CurrentDirectory
    3. Dim exeName As String = Path.GetFileName(Reflection.Assembly.GetExecutingAssembly.Location)
    4. Dim exeUpdate As String = exePath & "\Products\unsupported\tools\" & exeName
    5. Dim ProcessProperties As New ProcessStartInfo
    6. ProcessProperties.FileName = exePath & "\update.bat"
    7. ProcessProperties.WindowStyle = ProcessWindowStyle.Hidden 'Konsole verstecken
    8. Using srm As New IO.StreamWriter(exePath & "\update.bat") 'Batch erstellen
    9. With srm
    10. .WriteLine("CD /D """ & exePath & """")
    11. .WriteLine(":Start")
    12. .WriteLine("ERASE /Q /F """ & exeName & """||goto Start") 'In einer Schleife wird versucht die alte .exe zu löschen
    13. .WriteLine("COPY""" & exeUpdate & """ """ & exePath & "\" & exeName & """")
    14. .WriteLine("ERASE /Q /F update.bat")
    15. End With
    16. End Using
    17. Dim myProcess As Process = Process.Start(ProcessProperties) 'Batch starten
    18. End Sub


    Damit nicht versehentlich eine Endlosschleife beim Löschen der .exe entsteht, wäre es natürlich ratsam noch einen Zähler einzubauen, welcher die Schleife nach einer bestimmten Anzahl von Versuchen unterbricht.

    Etwas Arbeit will ich dir aber schon noch lassen :D

    Der Code kommt in die ApplicationEvents.vb, welche du über den Button "Anwendungsereignisse anzeigen", zu finden in den Pojekt Eigenschaften, öffnest.

    So, ich hoffe es hilft dir ;)

    MfG

    DarkAngel
    Nimm doch einen Installer, der macht das alles fein säuberlich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,

    also auch FormClosed geht leider nicht. Er schließt anscheindend die FOrm , aber führt den Befehl währenddessen aus und somit drehe ich mich im Kreis. Möö, File blockiert.

    Einen Installer habe ich ncoh nie versucht zu bauen.
    Ich überlege grade, ob sich der Aufwand "lohnt". Die Änderungen, die zu einem Update führen sind minimal jedesmal und sehr selten.

    Spannend ist das Thema aber natürlich alle mal. ;)

    Ich tip mal eben ins Blaue:

    Eiun Installer ist ein kleines Programm, welches das Updated-File über das Originale schreibt, wenn es denn ein update gibt??
    Also, die das original programm wird beieinem erkanntem update geschlossen und aus dem original Programm herausstarte ich eine kleine exe, die die Datei kopiert und danach automatisch das neue file schreibt?


    Mhh, dann müsste ich aus dem Ur Programm den installer starten und dort direkt mit einem Sleep begionnen.

    Kommt das in etwa hin?

    Dankenoch einmal an alle hier!