Ausnahmefehler des Typs "System.IO.IOException"

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Ausnahmefehler des Typs "System.IO.IOException"

    Hallo Leute,

    ich versuche gerade aus einer Datei Text zu lesen, eine bestimmte Zeile zu finden, diese zu verändern und wieder auf die gleiche Position zu schreiben.
    Sobald ich auf die Datai schreiben will bekomme ich folgende Fehlermeldung.

    Ein Ausnahmefehler des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten.
    Zusätzliche Informationen: Der Prozess kann nicht auf die Datei "C:\Users\Textdatei.txt" zugreifen, da sie von einem anderen Prozess verwendet wird.

    Das kuriose ist dabei daß nach der oberen aktion ich eine andere Textdatei lese und ändere (anderer pfad). Hier funktioniert alles.


    Gibt es eine Möglichkeit herauszufinden von welchem Prozess die Datei verwendet wird?
    Mein Prog ist einwenig umfangreicher. Der Teil aber der die Dateien bearbeiten soll sieht so aus:








    ' Anpassen der Parameter
    Pfad = Datei1_pfad
    Dim Datei1_lines() As String = System.IO.File.ReadAllLines(Pfad)
    Dim Zähler As Integer

    For Zähler = 0 To src_lines.Length - 1
    If Datei1_lines(Zähler).ToUpper.Contains("ABC") And Not Datei1_lines(Zähler).ToUpper.Contains("CBA") Then
    Datei1_lines(Zähler) = ("")
    Datei1_lines(Zähler) = ("ABC ist gleich wie CBA")
    End If
    If Datei1_lines(Zähler).ToUpper.Contains("EFG") Then
    Datei1_lines(Zähler) = ("")
    Datei1_lines(Zähler) = ("HIJKLMNOP")
    End If
    Next
    'FileClose()
    System.IO.File.WriteAllLines(Pfad, Datei1_lines) An dieser Stelle tritt der Fehler auf



    Pfad = Datei2_pfad
    Dim a1_abgearbeitet, a2_abgearbeitet As Boolean
    a2_abgearbeitet = False
    Dim datei2_lines() As String = System.IO.File.ReadAllLines(Pfad)

    For Zähler = 0 To datei2_lines.Length - 1
    If datei2_lines(Zähler).ToUpper.Contains("irgendwas") Then
    datei2_lines(Zähler) = ("") ' Zeile löschen
    If a2_abgearbeitet = False Then
    datei2_lines(Zähler) = ("")
    'dat_lines(Zähler).Remove(dat_lines(Zähler))
    datei2_lines(Zähler) = ("irgendetwas anderes"}

    a2_abgearbeitet = True

    Else
    'dat_lines(Zähler).Remove(dat_lines(Zähler))
    datei2_lines(Zähler) = ("")
    End If
    End If
    Next

    System.IO.File.WriteAllLines(Pfad, datei2_lines)


    End Sub
    Kann ich nicht nachvollziehen. Läuft bei mir. Auch bei einer 1000-Zeilen-Datei.
    Was ist src_lines?

    btw: Bitte CodeTags benutzen. Und die Farbe Rot entfernen, sonst gibt es Mecker mit den Moderatoren.
    Bei solchen Zeilen:

    VB.NET-Quellcode

    1. Datei1_lines(Zähler) = ("")
    2. Datei1_lines(Zähler) = ("HIJKLMNOP")

    Kannst Du die erste weglassen. Die 2. überschreibt es eh.

    ##########

    Eh, Moment mal. Du kannst in dem Ordner C:\Users keine Datei erstellen. Wenn ich es versuche, kommt bei mir
    System.UnauthorizedAccessException: "Der Zugriff auf den Pfad "C:\Users\Testdatei.txt" wurde verweigert."
    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.
    For Zähler = 0 To src_lines.Length - 1(src_lines) soll eigentlich datei1_lines heißen. Habe vergessen diese umzubenennen.

    Es sieht so aus als ob die Datei von irgend einem anderen Prozess benutzt wird.
    wie kann man diesen Prozess finden.

    Wow, habe das Problem gefunden.
    Es war noch ein geöffneter streamreader der auf die gleiche datei zugegriffen hat!

    Trotzdem, Danke!

    hugoboss28 schrieb:

    Es war noch ein geöffneter streamreader
    Deswegen solch immer in ein Using packen.
    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!
    Wenn man z.B. schreibt

    VB.NET-Quellcode

    1. Using fs As New IO.FileStream(Dateipfad, IO.FileMode.Open)
    2. '...
    3. End Using

    dann wird durch das End Using das FileStream-Objekt sauber entsorgt, sodass die Datei in diesem Fall wieder freigegeben wird. Das Using-Konstrukt ersetzt auch die Aufräum-Funktion Dispose und sollte immer dann eingesetzt werden, wenn nur im lokalen Block ein Disposable-Objekt genutzt werden soll. Wird ein entsprechendes Objekt länger genutzt als nur in einer Prozedur, dann nimmt man Using nicht. Aber dann sollte man abschließend das Dispose nicht vergessen, damit alles sauber aufgeräumt wird und keine Datenleichen alias memory leaks übrig bleiben.
    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.