Dateien können nicht gelöscht werden

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von kevin89.

    Dateien können nicht gelöscht werden

    Also ich mache Screenshots und lasse diese nach 30 Minuten löschen aber der verweigert mir immer denn zugriff weil die bilder von einem anderen prozess genutzt werden


    So lösche ich

    VB.NET-Quellcode

    1. Dim Folder As String = Application.StartupPath & "\Screenshot\"
    2. For Each Files As String In GetFiles(Folder)
    3. Dim FileName As String = IO.Path.GetFileName(Files)
    4. My.Computer.FileSystem.DeleteFile(Folder & "\" & FileName)
    5. Next


    Die Bilder werden aber nur von meinem Programm gebraucht und das soll sie ja alle 30 minuten löschen aber dann kommt das ja

    Liegt es vllt daran das ich eine E-Mail verschicke mit denn Bildern und die bilder danach gelöscht werden sollen ?

    VB.NET-Quellcode

    1. Dim Msg As New MailMessage
    2. Dim myCredentials As New System.Net.NetworkCredential
    3. myCredentials.UserName = ""
    4. myCredentials.Password = ""
    5. Msg.IsBodyHtml = False
    6. Dim mySmtpsvr As New SmtpClient()
    7. mySmtpsvr.Host = ""
    8. mySmtpsvr.Port = 25
    9. mySmtpsvr.UseDefaultCredentials = False
    10. mySmtpsvr.Credentials = myCredentials
    11. Try
    12. Msg.From = New MailAddress("")
    13. Msg.To.Add("")
    14. Msg.Subject = ""
    15. Msg.Body = ""
    16. Dim Folder As String = Application.StartupPath & "\Screenshot\"
    17. For Each Files As String In GetFiles(Folder)
    18. Dim FileName As String = IO.Path.GetFileName(Files)
    19. Msg.Attachments.Add(New Attachment(Folder & "\" & FileName))
    20. Next
    21. mySmtpsvr.Send(Msg)
    22. Catch ex As Exception
    23. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString)
    24. End Try
    25. 'Dateien Löschen
    26. DeleteFiles()

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Enten Mann“ ()

    Also es sieht nun so aus

    VB.NET-Quellcode

    1. Dim Message As New MailMessage
    2. Dim Credentials As New System.Net.NetworkCredential
    3. Credentials.UserName = ""
    4. Credentials.Password = ""
    5. Message.IsBodyHtml = False
    6. Dim Client As New SmtpClient()
    7. Client.Host = "mail.arcor.de"
    8. Client.Port = 25
    9. Client.UseDefaultCredentials = False
    10. Client.Credentials = Credentials
    11. Try
    12. Message.From = New MailAddress("")
    13. Message.To.Add("")
    14. Message.Subject = ""
    15. Message.Body = ""
    16. Dim Folder As String = Application.StartupPath & "\Screenshot\"
    17. For Each Files As String In GetFiles(Folder)
    18. Dim FileName As String = IO.Path.GetFileName(Files)
    19. Dim Data As New Attachment(Folder & "\" & FileName, MediaTypeNames.Image.Jpeg)
    20. Message.Attachments.Add(Data)
    21. Next
    22. Client.Send(Message)
    23. Catch ex As Exception
    24. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString)
    25. End Try
    26. 'Dateien Löschen
    27. DeleteFiles()


    Ich hatte das Data.Dispose hinter Client.Send(Message) gesetzt aber dann kommt ein fehler das Dispose kann mein Member von Data ist, wenn ich das Data.Dispose vor Next setze kann er nicht senden
    Ich würde das Ganze in deinem Fall so schreiben:

    VB.NET-Quellcode

    1. Try
    2. '[...]
    3. Dim Data As Attachment
    4. For Each Files As String In GetFiles(Folder)
    5. Dim FileName As String = IO.Path.GetFileName(Files)
    6. Data = New Attachment(Folder & "\" & FileName, MediaTypeNames.Image.Jpeg)
    7. Message.Attachments.Add(Data)
    8. Next
    9. Client.Send(Message)
    10. If (Data IsNot Nothing) Then Data.Dispose()
    11. Catch ex As Exception
    12. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString)
    13. End Try

    Evetuell ist auch das Client-Objekt an der Dateireferenz schuld, das müsstest du mal austesten. Im MSDN-Code steht Dispose() allerdings beim Attachment-Objekt - bestimmt nicht ohne Grund.
    Gruß
    hal2000
    Fehler
    Der Prozess kann nicht auf die Datei "C:\Users\Administrator\Desktop\DuckSPi\DuckSPi\bin\Debug\Screenshot\15_53_39.jpg" zugreifen, da sie von einem anderen Prozess verwendet wird.
    Code

    VB.NET-Quellcode

    1. Dim Message As New MailMessage
    2. Dim Credentials As New System.Net.NetworkCredential
    3. Credentials.UserName = ""
    4. Credentials.Password = ""
    5. Message.IsBodyHtml = False
    6. Dim Client As New SmtpClient()
    7. Client.Host = ""
    8. Client.Port = 25
    9. Client.UseDefaultCredentials = False
    10. Client.Credentials = Credentials
    11. Try
    12. Message.From = New MailAddress("")
    13. Message.To.Add("")
    14. Message.Subject = ""
    15. Message.Body = ""
    16. Dim Folder As String = Application.StartupPath & "\Screenshot\"
    17. Dim Data As Attachment
    18. For Each Files As String In GetFiles(Folder)
    19. Dim FileName As String = IO.Path.GetFileName(Files)
    20. Data = New Attachment(Folder & "\" & FileName, MediaTypeNames.Image.Jpeg)
    21. Message.Attachments.Add(Data)
    22. Next
    23. Client.Send(Message)
    24. If (Data IsNot Nothing) Then Data.Dispose()
    25. Catch ex As Exception
    26. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString)
    27. End Try
    28. 'Dateien Löschen
    29. DeleteFiles()
    Lase dir bitte mal das Tool "Handle" von Microsoft (Sysinternals) herunter. Setze dann auf den DeleteFiles()-Aufruf einen Haltepunkt. Minimiere die Umgebung, starte eine Konsole und gibt ein "handle 15_53_39" ein. Der Dateiname muss nicht vollständig sein. Die Ausgabe sagt dir, ob dein Programm überhaupt der Übeltäter ist, der die Datei sperrt. Poste dann bitte das Ergebnis.

    Link: technet.microsoft.com/de-de/sysinternals/bb896655.aspx

    EDIT: Ich habe deinen kompletten Code nun kopiert und getestet (mit echten Daten; Adresse, Passwort, Anhang). Einzige Änderung: & "\" in Zeile 29 entfernt. Funktioniert tadellos - die Mail kommt an und die Datei lässt sich anschließend per Code löschen.
    Gruß
    hal2000

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

    Das funtz aber nicht habs nu so

    VB.NET-Quellcode

    1. Dim Message As New MailMessage
    2. Dim Credentials As New System.Net.NetworkCredential
    3. Credentials.UserName = ""
    4. Credentials.Password = ""
    5. Message.IsBodyHtml = False
    6. Dim Client As New SmtpClient()
    7. Client.Host = "mail.arcor.de"
    8. Client.Port = 25
    9. Client.UseDefaultCredentials = False
    10. Client.Credentials = Credentials
    11. Try
    12. Message.From = New MailAddress("")
    13. Message.To.Add("")
    14. Message.Subject = ""
    15. Message.Body = ""
    16. Dim Folder As String = Application.StartupPath & "\Screenshot\"
    17. Dim Data As Attachment
    18. For Each Files As String In GetFiles(Folder)
    19. Dim FileName As String = IO.Path.GetFileName(Files)
    20. Data = New Attachment(Folder & FileName, MediaTypeNames.Image.Jpeg)
    21. Message.Attachments.Add(Data)
    22. Next
    23. Client.Send(Message)
    24. If (Data IsNot Nothing) Then Data.Dispose()
    25. Catch ex As Exception
    26. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString)
    27. End Try
    28. 'Dateien Löschen
    29. For Each Files As String In GetFiles(Folder)
    30. Dim FileName As String = IO.Path.GetFileName(Files)
    31. My.Computer.FileSystem.DeleteFile(Folder & "\" & FileName)
    32. Next


    Geht aba net

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

    Ich hatte im Deklarationsteil der Klasse eine ArrayList deklariert und in der For-Schleife folgendes geschrieben:

    VB.NET-Quellcode

    1. For [...]
    2. [...]
    3. theList.Add(Folder & FileName)
    4. Next

    Und die DeleteFiles()-Funktion dann so:

    VB.NET-Quellcode

    1. For Each f As String In theList
    2. IO.File.Delete(f)
    3. Next

    Damit wird das Ganze zwischengespeichert und du musst nicht alles nochmal erzeugen.
    Gruß
    hal2000
    Habs nun so

    VB.NET-Quellcode

    1. Private Sub DeleteFiles()
    2. For Each f As String In al
    3. IO.File.Delete(f)
    4. Next
    5. End Sub


    VB.NET-Quellcode

    1. Dim Message As New MailMessage
    2. Dim Credentials As New System.Net.NetworkCredential
    3. Credentials.UserName = ""
    4. Credentials.Password = ""
    5. Message.IsBodyHtml = False
    6. Dim Client As New SmtpClient()
    7. Client.Host = "mail.arcor.de"
    8. Client.Port = 25
    9. Client.UseDefaultCredentials = False
    10. Client.Credentials = Credentials
    11. Try
    12. Message.From = New MailAddress("")
    13. Message.To.Add("")
    14. Message.Subject = ""
    15. Message.Body = ""
    16. Dim Folder As String = Application.StartupPath & "\Screenshot\"
    17. Dim Data As Attachment
    18. For Each Files As String In GetFiles(Folder)
    19. Dim FileName As String = IO.Path.GetFileName(Files)
    20. Data = New Attachment(Folder & FileName, MediaTypeNames.Image.Jpeg)
    21. al.Add(Folder & FileName)
    22. Message.Attachments.Add(Data)
    23. Next
    24. Client.Send(Message)
    25. If (Data IsNot Nothing) Then Data.Dispose()
    26. Catch ex As Exception
    27. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString)
    28. End Try
    29. 'Dateien Löschen
    30. DeleteFiles()

    und nach public class form1 das

    VB.NET-Quellcode

    1. Dim al As ArrayList


    Fehler
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    VB.NET-Quellcode

    1. For Each f As String In al
    Trotzdem kommt das
    Der Prozess kann nicht auf die Datei "C:\Users\Administrator\Desktop\DuckSPi\DuckSPi\bin\Debug\Screenshot\15_53_39.jpg" zugreifen, da sie von einem anderen Prozess verwendet wird.
    bei

    VB.NET-Quellcode

    1. IO.File.Delete(f)
    Versteh' ich net - dein Code funktioniert bei mir, und zwar so wie du ihn gepostet hast (mit den genannten Modifikationen). Ein bisschen zu weit gegriffen wäre wohl das Aufsetzen einer virtuellen Maschine mit Windows XP um den Sachverhalt zu testen...

    Ich schicke dir mal mein komplettes Projekt, wie es bei mir funktioniert. Siehe Anhang.
    Dateien
    • Projekt.zip

      (43,2 kB, 191 mal heruntergeladen, zuletzt: )
    Gruß
    hal2000
    von Enten Mann
    Der Prozess kann nicht auf die Datei "C:\Users\Administrator\Desktop\DuckSPi\DuckSPi\bin\Debug\Screenshot\15_53_39.jpg" zugreifen, da sie von einem anderen Prozess verwendet wird.
    Du hast den Fehler gepostet, das löschen wird auch nicht funz weil deine Anwendung darauf zugreift, was ist da so schwer zu verstehen... :D ....schau deine Code etwas genau an, irgend wo hast du ein kleines denkfehler ! :D