Updater kann Datei nicht löschen

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Knato.

    Updater kann Datei nicht löschen

    Hallo
    Ich wusste nicht, was ich in die Überschrift schreiben sollte. Was besseres ist mir nicht eingefallen.
    Also, es geht darum, dass ich einen Updater für mein Programm programmiert habe, welcher sich im selben Verzeichnis wie die exe-Datei befindet. Dieser soll nach dem Start prüfen, ob sich die alte Version der exe-Datei im StartupPath des Updaters befindet. Ist das der Fall, soll er die Datei löschen. Und nicht gleich böse werden, kenn mich noch nicht so gut aus.

    Aber genau dann kommt der Fehler:
    "Zugriff wurde Verweigert"
    (Siehe Bild)

    Ich habe folgenden Code benutzt (ein Teil davon):

    VB.NET-Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Private WithEvents httpclient As WebClient
    4. Dim Pfad As String = Nothing
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. If My.Computer.FileSystem.FileExists(Application.StartupPath & "\rechner_install.exe") Then ' Prüfen ob Datei vorhanden ist
    7. My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\rechner_install.exe") ' Wenn ja löschen
    8. End If
    9. Pfad = Application.StartupPath
    10. Try
    11. Me.Show()
    12. httpclient = New WebClient
    13. Dim URL As String = "https://dl.dropbox.com/u/58564123/RechnerInstallver.exe"
    14. Application.DoEvents()
    15. httpclient.DownloadFileAsync(New Uri(URL), Pfad)
    16. Application.DoEvents()
    17. Catch ex As Exception
    18. MsgBox("Es ist folgender Fehler aufgetreten:" & vbNewLine & ex.ToString, MsgBoxStyle.Critical, "Es ist ein Fehler aufgetreten!")
    19. End
    20. End Try
    21. End Sub


    Stimmt da was nicht? Auch wenn ich mein Programm als Administrator ausführe, kommt dieser Fehler. Was mach ich falsch? Stimmt der Code überhaupt so, oder ist das totaler Mist? Auf jeden Fall ging der Updater vorhin noch, als ich noch einen SaveFileDialog zum Speicherort festlegen drin hatte. Aber jetzt habe ich mir gedacht, der Updater soll automatisch die alte Version löschen und die neue einfügen.
    Hoffe ihr könnt mir helfen! ;)
    Bilder
    • NET.Framework-Fehler.PNG

      76,51 kB, 474×197, 159 mal angesehen
    2 Möglichkeiten:
    - Das Programm läuft gerade
    - Du benötigst Administratorrechte
    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!
    Das Programm läuft nicht, es wird zuvor mit "Me.Close" beendet. Aber vielleicht sollte ich mal "Application.Exit" verwenden. Ich bin Systemadministrator.
    Liegt es daran, dass mein Programm dieses Warn-Symbol hat:



    Aber mit dem Code stimmt alles?
    Klick mal in der Fehlermeldung auf Details und poste das hier wenn möglich :)
    Normaler Weise müsste dort auch stehen in welcher Zeile der Fehler auftaucht :)

    Ansonsten beschreib bitte nochmal genauer , was du alles öffnest :)
    Ich weiß z.b. nicht ob du genau das Programm löschen willst, welches gerade offen ist oder nicht :S

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

    Also:
    Ich habe ein Programm, welches eine Update-Funktion hat. Diese Funktion erkennt das Update. Sobald mit "Ok" bestätigt wurde, wird das Programm geschlossen und der Updater sollte, nach dem er das bestehende, gerade geschlossene Programm gelöscht hat. Aber der Updater kommt ja nicht mal, da vorher dieser Fehler kommt:

    Spoiler anzeigen
    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

    ************** Ausnahmetext **************
    System.UnauthorizedAccessException: Der Zugriff auf den Pfad "D:\Rechner-Versuch\rechner_install.exe" wurde verweigert.
    bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    bei System.IO.File.Delete(String path)
    bei Microsoft.VisualBasic.FileIO.FileSystem.DeleteFileInternal(String file, UIOptionInternal showUI, RecycleOption recycle, UICancelOption onUserCancel)
    bei Microsoft.VisualBasic.MyServices.FileSystemProxy.DeleteFile(String file)
    bei Updater.Form1.Form1_Load(Object sender, EventArgs e)
    bei System.EventHandler.Invoke(Object sender, EventArgs e)
    bei System.Windows.Forms.Form.OnLoad(EventArgs e)
    bei System.Windows.Forms.Form.OnCreateControl()
    bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    bei System.Windows.Forms.Control.CreateControl()
    bei System.Windows.Forms.Control.WmShowWindow(Message& m)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    bei System.Windows.Forms.Form.WmShowWindow(Message& m)
    bei System.Windows.Forms.Form.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** Geladene Assemblys **************
    mscorlib
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.544 (RTMLDR.030319-5400).
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
    ----------------------------------------
    Updater
    Assembly-Version: 1.1.0.0.
    Win32-Version: 1.1.0.0.
    CodeBase: file:///D:/Rechner-Versuch/Updater.exe.
    ----------------------------------------
    Microsoft.VisualBasic
    Assembly-Version: 10.0.0.0.
    Win32-Version: 10.0.30319.1 built by: RTMRel.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
    ----------------------------------------
    System
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.544 built by: RTMLDR.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
    ----------------------------------------
    System.Core
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.450 built by: RTMLDR.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
    ----------------------------------------
    System.Windows.Forms
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.560 built by: RTMLDR.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    ----------------------------------------
    System.Drawing
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.568 built by: RTMLDR.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    ----------------------------------------
    System.Runtime.Remoting
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
    ----------------------------------------
    mscorlib.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.454 (RTMLDR.030319-4500).
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
    ----------------------------------------
    System.Windows.Forms.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.454 built by: RTMLDR.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    ----------------------------------------

    ************** JIT-Debuggen **************
    Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
    Konfigurationsdatei der Anwendung oder des Computers
    (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
    Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

    Zum Beispiel:

    <configuration>
    <system.windows.forms jitDebugging="true" />
    </configuration>

    Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
    Ausnahmen an den JIT-Debugger gesendet, der auf dem
    Computer registriert ist, und nicht in diesem Dialogfeld behandelt.




    Deutlich genug? :D
    Welches Warnungs-Symbol ? ?(

    Edit : Kann es vllt. sein , dass erst der Updater gestartet wird und kurz danach erst das Programm geschlossen wird ?
    Edit : Also so , dass der Updater einfach zu schnell ist und das Programm löschen will , obwohl es noch offen ist.

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

    Versuch es so zu machen , dass das normale Programm den Updater startet und das Programm sich dann selbstständig beendet ... :)
    In etwa so :

    VB.NET-Quellcode

    1. Dim Update As New Process
    2. Update.StartInfo.FileName = Application.StartupPath & "/Updater.exe" (< Pfad anpassen!)
    3. Update.Start
    4. Me.Close


    Und wenn der Updater dann startet machste dein Code , aber nimm anstatt(Zeile 7) :

    VB.NET-Quellcode

    1. If My.Computer.Filesystem.FileExists(Application.StartupPath & "/rechner_install.exe") Then

    Das hier :

    VB.NET-Quellcode

    1. If My.Computer.Filesystem.FileExists(Application.StartupPath & "/rechner_install.exe") = True Then
    Du musst an Pfad ggf. glaube ich noch den namen anhängen.

    VB.NET-Quellcode

    1. Application.DoEvents()

    Bitte nicht!
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    NicCc schrieb:

    Versuch es so zu machen , dass das normale Programm den Updater startet und das Programm sich dann selbstständig beendet ... :)
    In etwa so :

    VB.NET-Quellcode

    1. Dim Update As New Process
    2. Update.StartInfo.FileName = Application.StartupPath & "/Updater.exe" (< Pfad anpassen!)
    3. Update.Start
    4. Me.Close


    Und wenn der Updater dann startet machste dein Code , aber nimm anstatt(Zeile 7) :

    VB.NET-Quellcode

    1. If My.Computer.Filesystem.FileExists(Application.StartupPath & "/rechner_install.exe") Then

    Das hier :

    VB.NET-Quellcode

    1. If My.Computer.Filesystem.FileExists(Application.StartupPath & "/rechner_install.exe") = True Then


    Ausgebessert!
    Ergebnis:



    Hab auch im Updater noch an den Pfad den Namen angehängt....
    Als Admin starten.
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Was passiert, wenn Du das Programm im Explorer löschen willst?
    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!
    Gehe mal die Konfiguration unter MyProject->Windows-Einstellungen und ersetze

    XML-Quellcode

    1. <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    durch

    XML-Quellcode

    1. <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />


    Speichern und Visual Studio als Admin neustarten. (Macht er automatisch, wenn du das Programm ausführen willst ;))

    Memo schrieb:

    Gehe mal die Konfiguration unter MyProject->Windows-Einstellungen und ersetze
    Das musst Du natürlich im Update-Programm machen.
    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!

    RodFromGermany schrieb:

    Was passiert, wenn Du das Programm im Explorer löschen willst?


    Na, was soll schon passieren. Es kommt die ganz normale "lösch-bestätigung"




    Memo schrieb:

    Speichern und Visual Studio als Admin neustarten. (Macht er automatisch, wenn du das Programm ausführen willst ;))


    Wüsste nicht, was mir das bringen soll, aber ok, ich mach es mal, nach dem das Service Pack 1 installiert wurde. (Habs ausversehen gelöscht xD)