Problem - Datei wird noch von einem anderen Prozess verwendet

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem - Datei wird noch von einem anderen Prozess verwendet

    Moin!

    ich habe ein Programm geschrieben um Dateien einsortieren. Hierbei wird in einem Dialogteil der Inhalt über ein WebBrowser-Control angezeigt.

    Irgendwann soll dann die Datei die angezeigt wird verschoben bzw. umbenannt werden.

    Dann bekomme ich aber folgende Fehlermeldung:


    ---------------------------
    Information
    ---------------------------
    Fehler bei Fehler beim Move
    System.IO.IOException: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird.
    bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    bei System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
    bei EBL.MapEdit.FUNC_FileAndFolder.RenameFile(String Path, String NewName, Boolean Overwrite, Boolean ShowErrorMessage) in C:\VSProjects\EBL.MapEdit_Dev\EBL.MapEdit_Dev\EBL.MapEdit_Dev\FUNC_FileAndFolder.vb:Zeile 43.
    -- Product Version 8.3.15.0 - Wpf
    ---------------------------


    Bisher habe ich es mit

    VB.NET-Quellcode

    1. WebBrowser.Navigate("")
    2. If FaF.RenameFile(OldFullFileName, NewFullFileName) = 1 Then
    3. XMsgBox.ShowDialog("Vorgang des Einsortierens abgeschlossen.", XMsgBoxButtons.OK, XMsgBoxIcon.Critical)
    4. End If


    versucht zu umgehen - leider ohne Erfolg.

    Nun habe ich zwei Fragen dazu:

    * wie kann das irgendwie doch hin bekommen?
    * wenn es nicht an dem Webbrowser liegt, wie bekomme ich raus welcher Prozess der Übeltäter ist?

    Gruß Jan
    @jan99 Was sind das für Dateien (angezeigte Bilder | andere)?
    Wie werden diese Dateien in Deinem Programm verwaltet?
    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!

    jan99 schrieb:

    die Vorschau in dem Webbrowser
    Das ist es, was das verhindert.
    Du musst das Dokument vom Webbrowser lösen.
    Mit welchem Code packst Du das denn da rein?
    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!
    @jan99 Probierma, vorher zu einer anderen oder der Leer-Seite zu navigieren.
    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!
    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!
    Moin!

    ich hatte einen Adobe Task - diesen habe ich beendet und beim nächsten Start ist dieser nicht wieder erschienen.

    Dann habe ich folgende zwei Wege ausprobiert.

    Weg 1

    VB.NET-Quellcode

    1. WebBrowser.Navigate([url]http://www.heute.de[/url])
    2. If FaF.RenameFile(OldFullFileName, NewFullFileName) = 1 Then
    3. XMsgBox.ShowDialog("Vorgang des Einsortierens abgeschlossen.", XMsgBoxButtons.OK, XMsgBoxIcon.Critical)
    4. End If


    Hier wurde die Webseite von den heute-Nachrichten geöffnet - dennoch war die Datei gesperrt!

    Weg 2

    VB.NET-Quellcode

    1. WebBrowser.Navigate(GetFullPdfOfListAtLast)
    2. If FaF.RenameFile(OldFullFileName, NewFullFileName) = 1 Then
    3. XMsgBox.ShowDialog("Vorgang des Einsortierens abgeschlossen.", XMsgBoxButtons.OK, XMsgBoxIcon.Critical)
    4. End If


    Auch hier dieselbe Meldung, obwohl eine andere PDF-Datei angezeigt wurde! :(

    Möglicher Lösungsweg mit weiterer Fragestellung...

    Dann habe ich folgendes ausprobiert:

    VB.NET-Quellcode

    1. Webbrowser.Dispose


    Dann wurde das Control zwar entfernt, aber ich konnte auf meine Datei zugreifen.

    Wäre jetzt die Frage - kann ich mittels Code das Webbrowser-Control neu zu Laufzeit erstellen und wie?

    Gruß Jan

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

    @jan99 Probierma

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. WebBrowser1.Navigate("C:\Temp\MyDoc.pdf")
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. WebBrowser1.DocumentStream = Nothing
    6. Dim fi = New IO.FileInfo("C:\Temp\MyDoc.pdf")
    7. fi.MoveTo("C:\Temp\Doc\MyDoc.pdf")
    8. End Sub
    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!
    Moin!

    hatte mich schon gefreut - leider wieder die Meldung:

    ---------------------------
    Information
    ---------------------------
    Fehler bei Fehler beim Move
    System.IO.IOException: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird.
    bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    bei System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
    bei EBL.MapEdit.FUNC_FileAndFolder.RenameFile(String Path, String NewName, Boolean Overwrite, Boolean ShowErrorMessage) in C:\VSProjects\EBL.MapEdit_Dev\EBL.MapEdit_Dev\EBL.MapEdit_Dev\FUNC_FileAndFolder.vb:Zeile 43.
    -- Product Version 8.3.15.0 - Wpf
    ---------------------------


    Gruß Jan
    @jan99 Sorry, ich hatte das in 3 Button und hier zusammengeschoben.
    Der Webbrowser braucht Zeit, das Dokument zu entfernen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. WebBrowser1.Navigate("C:\Temp\MyDoc.pdf")
    4. End Sub
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. WebBrowser1.DocumentStream = Nothing
    7. End Sub
    8. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    9. Dim fi = New IO.FileInfo("C:\Temp\MyDoc.pdf")
    10. fi.MoveTo("C:\Temp\Doc\MyDoc.pdf")
    11. End Sub
    12. End Class
    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!
    Moin!

    danke für Deine Mithilfe …

    Ich habe jetzt folgenden Versuch unternommen:

    VB.NET-Quellcode

    1. WebBrowser.DocumentStream = Nothing
    2. With pbar_Freigabe
    3. .Maximum = _StepsFreigabeProcessbar
    4. .Value = 0
    5. .Visible = True
    6. For i = 0 To _StepsFreigabeProcessbar
    7. .Value = i
    8. Next
    9. .Visible = False
    10. End With
    11. If FaF.RenameFile(OldFullFileName, NewFullFileName) = 1 Then
    12. XMsgBox.ShowDialog("Vorgang des Einsortierens abgeschlossen.", XMsgBoxButtons.OK, XMsgBoxIcon.Critical)
    13. End If


    Mit der Prozessbar dachte ich etwas zu machen damit der Anwender nicht denkt es hat sich aufgehängt.

    Aber das war wohl der falsche Ansatz. Damit kommt, entgegen der Einzelklicks, weiterhin die Meldung.

    Ist für so etwas wait besser oder wählt man noch ganz andere Wege?

    gruß Jan
    @jan99 Dann probierma, das ganze mit einerm Timer zu machen.
    Beim Start Nothing setzen,
    beim ersten Tick die DAtei bewegen und den Timer anhalten.
    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!
    @jan99 Sleep() hab ich probiert, geht nicht, deswegen der Timer, der sleept sozusagen im Main-Thread.
    Dies hier funktioniert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. WebBrowser1.Navigate("c:\Temp\MyDoc.pdf")
    4. End Sub
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. WebBrowser1.DocumentStream = Nothing
    7. Timer1.Start()
    8. End Sub
    9. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    10. Timer1.Stop()
    11. Dim fi = New IO.FileInfo("C:\Temp\MyDoc.pdf")
    12. fi.MoveTo("C:\Temp\Doc\MyDoc.pdf")
    13. End Sub
    14. End Class
    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!
    @petaod Jou, bei 100 ms knallt es noch:

    VB.NET-Quellcode

    1. Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. WebBrowser1.DocumentStream = Nothing
    3. Await Task.Delay(1000)
    4. Dim fi = New IO.FileInfo("C:\Temp\MyDoc.pdf")
    5. fi.MoveTo("C:\Temp\Doc\MyDoc.pdf")
    6. End Sub
    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!
    Man kann ja auch ne nebenläufige Do-Schleife mit 100 ms-Pausen und Try-Catch machen, bis das Verschieben erfolgreich war.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    RodFromGermany schrieb:

    @jan99 Sleep() hab ich probiert, geht nicht, deswegen der Timer, der sleept sozusagen im Main-Thread.
    Dies hier funktioniert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. WebBrowser1.Navigate("c:\Temp\MyDoc.pdf")
    4. End Sub
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. WebBrowser1.DocumentStream = Nothing
    7. Timer1.Start()
    8. End Sub
    9. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    10. Timer1.Stop()
    11. Dim fi = New IO.FileInfo("C:\Temp\MyDoc.pdf")
    12. fi.MoveTo("C:\Temp\Doc\MyDoc.pdf")
    13. End Sub
    14. End Class


    Moin !

    diesen Weg habe ich gestern implementiert und es funktioniert - wobei ich das mit dem Timer.Tick nicht ganz verstanden habe.

    Danke allen mithelfenden.

    Gruß Jan