Datei löschen, die von einem anderen Prozess verwendet wird

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Datei löschen, die von einem anderen Prozess verwendet wird

    Hallo,

    ich habe folgenden Code in meinem VSTO-Addin, bei dem in einer Mail in Outlook ein Attachment "myattachment" gespeichert wird, dann macht die Funktion "Watermark.myWatermark()" daraus eine Kopie mit Wasserzeichen "myCopy".

    VB.NET-Quellcode

    1. Public Sub Wasserzeichen_Click(sender As Object, e As RibbonControlEventArgs) Handles Wasserzeichen.Click
    2. If ThisAddIn.mailItem IsNot Nothing Then
    3. If ThisAddIn.mailItem.Attachments.Count > 0 Then
    4. Dim myattachment As String
    5. Dim myCopy As String
    6. Dim myfilename As String
    7. Cursor.Current = Cursors.WaitCursor
    8. myfilename = ThisAddIn.mailItem.Attachments(1).FileName
    9. ' Attachment herunterladen
    10. myattachment = Path.Combine(Path.GetDirectoryName(Path.GetTempPath()), myfilename).ToString()
    11. ThisAddIn.mailItem.Attachments(1).SaveAsFile(myattachment)
    12. myCopy = Watermark.myWatermark(myattachment, myfilename)
    13. 'MessageBox.Show(myCopy, "Gespeichert")
    14. ThisAddIn.mailItem.Attachments(1).Delete()
    15. ThisAddIn.mailItem.Attachments.Add(myCopy)
    16. Cursor.Current = Cursors.Default
    17. ' My.Computer.FileSystem.DeleteFile(myattachment)
    18. ' My.Computer.FileSystem.DeleteFile(myCopy)
    19. End If
    20. End If
    21. End Sub


    Die beiden Dateien will ich aus dem Temp-Ordner löschen, wenn ich fertig bin. "File.Delete()" bzw. "My.Computer.FileSystem.DeleteFile()" funktioniert leider nicht:

    Quellcode

    1. An exception of type 'System.IO.IOException' occurred in mscorlib.dll but was not handled in user code
    2. Additional information: Der Prozess kann nicht auf die Datei "C:\Users\...\Anhang.pdf" zugreifen, da sie von einem anderen Prozess verwendet wird.


    Outlook selbst greift noch auf die Datei zu.

    Hat jemand eine Idee, wie ich die Dateien trotzdem löschen kann? Kann ich sie mit einem Dispose() befreien?

    Vielen Dank.

    Viele Grüße
    Christian
    Hallo

    Dann muss deine funktion Watermark.myWatermark das Object wieder freigeben. Das wäre übrigens auch ein besserer Titel für diesen Thread. ;)

    Poste mal bitte den Code dieser Routine und dann können wir uns das ansehen. Aus dem jetzigen geht diesbezüglich leider nichts hervor.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    imho74 schrieb:

    Hat jemand eine Idee, wie ich die Dateien trotzdem löschen kann?
    Trotzdem löschen geht nicht, dafür sorgt glücklicherweise das Betriebssystem. Woher sollte der Löschende wissen, dass die Datei tatsächlich frei ist?
    Ansonsten siehe Post #2 von @Nofear23m.
    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!

    [Solved] Datei löschen, die von einem anderen Prozess verwendet wird

    Nofear23m schrieb:


    Poste mal bitte den Code dieser Routine und dann können wir uns das ansehen. Aus dem jetzigen geht diesbezüglich leider nichts hervor.


    Hi,

    anbei der Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports iTextSharp.text
    3. Imports iTextSharp.text.pdf
    4. Partial Public Class Watermark
    5. Public Shared Function myWatermark(ByVal myattachment As String, ByVal myfilename As String) As String
    6. Dim strFileLocation As String = myattachment
    7. Dim strFileLocationOut As String = Path.Combine(Path.GetDirectoryName(Path.GetTempPath()), "Kopie_" + myfilename).ToString()
    8. Dim WatermarkLocation As String = "..\Path\To\My\Watermark.png"
    9. Dim Document As New Document()
    10. Dim PdfReader As New PdfReader(strFileLocation)
    11. Dim PdfStamper As New PdfStamper(PdfReader, New FileStream(strFileLocationOut, FileMode.Create, FileAccess.Write, FileShare.None))
    12. Dim img As Image = iTextSharp.text.Image.GetInstance(WatermarkLocation)
    13. img.SetAbsolutePosition(200, 300)
    14. Dim waterMark As PdfContentByte
    15. Dim pageIndex As Integer
    16. For pageIndex = 1 To PdfReader.NumberOfPages Step pageIndex + 1
    17. waterMark = PdfStamper.GetOverContent(pageIndex)
    18. waterMark.AddImage(img)
    19. Next
    20. PdfStamper.FormFlattening = True
    21. PdfStamper.Close()
    22. PdfStamper.Dispose()
    23. File.Delete(myWatermarkLocation)
    24. Return strFileLocationOut
    25. End Function
    26. End Class


    Vielen Dank und viele Grüße
    Christian

    Edit:
    Ok, ich glaube ich bekomme eine Erkältung oder so. Jetzt geht es, nachdem ich

    VB.NET-Quellcode

    1. PdfReader.Close()
    2. PdfReader.Dispose()
    3. Document.Close()
    4. Document.Dispose()


    noch hinzugefügt habe.

    Irgendwie hat es mich auf eine falsche Fährte geführt, dass das OS gesagt hat, dass die Datei von Outlook gesperrt wird. X/

    Danke für den Hinweis, Sascha. :)

    Viele Grüße
    Christian

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

    Hallo

    Genau das dachte ich mir nämlich.

    Noch besser ist es allerdings du setzt das ganze in einen Using Block. So ist sichergestellt das immer Dispose aufgerufen wird, wenn man sich das angewöhnt kann man das ...Dispose nicht vergessen, da ja EndUsing automatsisch dabei.

    VB.NET-Quellcode

    1. Using reader as New PdfReader
    2. ....
    3. End Using


    Schöne Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##