visual basic the process cannot access the file because it is being used by another process

  • VB.NET
  • .NET 5–6

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von tunixx.

    visual basic the process cannot access the file because it is being used by another process

    Hallo,

    ich möchte eine Textdatei / CSV-Datei, die von einem externen Programm generiert wird, auslesen und anschließend löschen. Dazu wird von einem Backgroundworker ein Verzeichnis überwacht. Beim ersten Mal Lesen funktioniert auch alles problemlos. Beim zweiten Mal Lesen bekomme ich eine Fehlermeldung:

    the process cannot access the file because it is being used by another process

    Ich habe schon versucht, die Datei nach dem Lesen zu Schließen aber ich weiß nicht genau wo mein Fehler sein könnte.

    Wäre für jeden Hinweis sehr dankbar.

    Hier der relevante Sourcecode:

    VB.NET-Quellcode

    1. Public Class Patientfile
    2. Dim PatNummer As String
    3. Dim PatName As String
    4. Dim PatGeburtstag As String
    5. Private Sub ErsetzeUmlaute(ByRef reader As String)
    6. reader = Replace(reader, "{", "ä")
    7. reader = Replace(reader, "}", "ü")
    8. reader = Replace(reader, "|", "ö")
    9. reader = Replace(reader, "~", "ß")
    10. reader = Replace(reader, "]", "Ü")
    11. reader = Replace(reader, "\", "Ö")
    12. reader = Replace(reader, "[", "Ä")
    13. End Sub
    14. Sub LoadtextFromFile(ByVal fileName As String)
    15. Try
    16. Using csvParser As New TextFieldParser(fileName)
    17. With csvParser
    18. ' Feld-Trennzeichen
    19. .SetDelimiters(",")
    20. ' Festlegen, ob die Datenfelder in Anführungszeichen stehen
    21. .HasFieldsEnclosedInQuotes = False ' bzw. True
    22. ' Falls die 1. Zeile die Spaltennamen enthält
    23. 'Dim Header As String = .ReadLine()
    24. ' Datei zeilenweise durchlaufen
    25. Dim FieldData() As String
    26. Do While Not .EndOfData
    27. ' alle Datenfelder der aktuellen Datenzeile lesen
    28. FieldData = .ReadFields()
    29. PatNummer = FieldData(0)
    30. PatName = FieldData(1)
    31. PatGeburtstag = FieldData(2)
    32. Debug.Print(FieldData(0)) ' 1. Feld
    33. Debug.Print(FieldData(1)) ' 2. Feld
    34. Debug.Print(FieldData(2)) ' 3. Feld
    35. Loop
    36. End With
    37. End Using
    38. Catch ex As Exception
    39. MsgBox(ex.Message)
    40. End Try
    41. End Sub
    42. Sub DeletetextFile(fileName As String)
    43. My.Computer.FileSystem.DeleteFile(fileName)
    44. End Sub
    45. Function GetPatName() As String
    46. Return PatName
    47. End Function
    48. Function GetPatNummer() As String
    49. Return PatNummer
    50. End Function
    51. Function GetPatGeburtstag() As String
    52. Return PatGeburtstag
    53. End Function
    54. End Class
    55. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    56. While boolProgrammEnde = False
    57. If File.Exists(tbWatchThisFolder.Text & tbWatchThisFile.Text) Then
    58. Dim Patient As New Patientfile
    59. 'Code, der ausgeführt wird wenn eine Datei gefunden wird:
    60. With Patient
    61. .LoadtextFromFile(tbWatchThisFolder.Text & tbWatchThisFile.Text)
    62. .DeletetextFile(tbWatchThisFolder.Text & tbWatchThisFile.Text) 'Lösche die Datei nach dem Lesen wieder
    63. tbLog.AppendText(.GetPatNummer & vbCrLf)
    64. tbLog.AppendText(.GetPatName & vbCrLf)
    65. tbLog.AppendText(.GetPatGeburtstag & vbCrLf)
    66. End With
    67. End If
    68. End While
    69. End Sub

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

    @tunixx In welcher Zeile Deines Codes kommt denn diese Exception?
    Verwende einen FileSystemWatcher.
    Möglicherweise arbeitet der TextFieldParser nicht sauber. Verwende einen anderen Konstruktor, dem Du einen Stream auf Deine Datei übergibst, diesen Stream erstelle mit Using.
    learn.microsoft.com/de-de/dotn…parser.-ctor?view=net-7.0
    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!
    Ich bekomme die Fehlermeldung über die Exception in Zeile 51.

    Ich hatte ein ähnliches Programm schon mal ohne den Textfieldparser geschrieben und das lief problemlos. Kann gut sein, dass der die Wurzel des Übels ist. Ich probiere es aus und berichte.

    EDIT: Textfieldparser komplett entfernt - immer noch die gleiche Fehlermeldung. An dem liegt es also nicht.

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

    tunixx schrieb:

    Ich bekomme die Fehlermeldung über die Exception in Zeile 51.
    X(
    In welcher Zeile Deines Codes kommt die Exception? Nicht im Catch-Zweig, sondern im Code.
    Lass das Try-Catrch weg.
    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!
    Wo wird der BGW (OMG! ein BGW) aufgerufen und wie oft?
    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.
    In welcher Zeile Deines Codes kommt die Exception? Nicht im Catch-Zweig, sondern im Code.Lass das Try-Catrch weg.


    Sorry, bin halt blutiger Amateur u. Newbie. Die Fehlermeldung kommt beim TextFieldParser, also Zeile 22.


    ​Wo wird der BGW (OMG! ein BGW) aufgerufen und wie oft?


    Im Konstruktor der Form1

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. CheckForIllegalCrossThreadCalls = False
    3. BackgroundWorker1.RunWorkerAsync()
    4. tbWatchThisFile.Text = My.Settings.TBFILENAME
    5. tbWatchThisFolder.Text = My.Settings.TBPATH
    6. End Sub

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

    Dass eine Frage eine Frage ist, sieht man doch am Fragezeichen …
    Wozu braucht es eigentlich den BGW? Wie lange dauert denn das Dateneinlesen?
    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.
    Frage: Wofür brauchst du »Private Sub ErsetzeUmlaute«?Gibt es wirklich noch Texte im DIN 66303 (ISO 646-DE) Format?


    Leider ja


    Dass eine Frage eine Frage ist, sieht man doch am Fragezeichen …Wozu braucht es eigentlich den BGW? Wie lange dauert denn das Dateneinlesen?


    Ich hab den Code aus einem Programm, das ich vor längerer Zeit geschrieben habe. Da hat es problemlos funktioniert.
    Ich denke ich werde mir tatsächlich den FileSystemWatcher mal näher anschauen um den BG zu umgehen.

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

    tunixx schrieb:

    also Zeile 22.
    Überzeuge Dich davon, dass die Datei an diesem Pfad tatsächlich existiert.
    Setze einen Haltepunkt auf die Zeile und sieh Dir den Inhalt der Variable fileName an.
    Lerne zu debuggen: Debuggen, Fehler finden und beseitigen
    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!
    Im Übrigen glaube ich inzwischen, dass im Sinne der usprünglichen Fragestellung diese Zeile das Problem ist:

    VB.NET-Quellcode

    1. If File.Exists(tbWatchThisFolder.Text & tbWatchThisFile.Text) Then
    2. Dim Patient As New Patientfile


    Es werden laufend neue Klassen angelegt, die auf die Datei zugreifen und sich dabei ins Gehege kommen.

    Ich habe den Original Source Code nicht mehr, da ich ja jetzt den File System Watcher benutze.
    Was ich nicht bedacht habe: Die Datei, die überwacht werden soll liegt im Netzwerk auf einem anderen Computer. Da funktioniert der FSW nicht. Ich stehe also wieder am Anfang und komme nicht drum herum, mit File.Exists zu arbeiten.

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

    tunixx schrieb:

    Es werden laufend neue Klassen angelegt
    Was ist bei Dir hier der Unterschied zwischen Klasse und Datei?
    Beschreibe mal konkret den Ablauf.
    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!
    ​Was ist bei Dir hier der Unterschied zwischen Klasse und Datei?Beschreibe mal konkret den Ablauf.


    Keine Ahnung ob es stimmt. So erklär ich mir das Problem jedenfalls mit meinem fundierten Halbwissen.

    Ich hab das Programm jetzt noch mal neu geschrieben. Den Backgroundworker hab ich durch await / async ersetzt. Die Fehlermeldung, dass kein Dateizugriff möglich sei, kam wieder.
    Nachdem ich die die Klasse Patientenfile rausgeschmissen hab und statt dessen globale Variablen benutzt habe, lief es problemlos.