Absturz bei Daeiabfrage

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

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

    Absturz bei Daeiabfrage

    Hi,

    ich benutze folgenden Code um zu Prüfen, ob eine Datei geöffnet werden kann oder nicht:

    VB.NET-Quellcode

    1. Public Function FileInUse(ByVal sFile As String) As Boolean
    2. If System.IO.File.Exists(sFile) Then
    3. Try
    4. Dim F As Short = CShort(FreeFile())
    5. FileOpen(F, sFile, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
    6. FileClose(F)
    7. Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
    8. Return True
    9. End Try
    10. End If
    11. Return False
    12. End Function


    zu 99% funktioniert das auch, manchmal führt es aber zum Absturz trotz der Try...catch
    Diese Variante habe ich auch probiert:

    VB.NET-Quellcode

    1. Public Function FileInUse(ByVal sfile As String) As Boolean
    2. If System.IO.File.Exists(sfile) Then
    3. Dim stream As IO.FileStream = Nothing
    4. Dim File = New FileInfo(sfile)
    5. Try
    6. stream = File.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
    7. stream.Close()
    8. Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
    9. Return True
    10. End Try
    11. End If
    12. Return False
    13. End Function


    Gleiches Ergebnis.

    Der Fehler lautet: "Datei in Benutzung..." und wird nicht gefangen.

    Gibt es hier Alternativen um vorab sicher zu prüfen, ob eine Datei nicht von einer anderen App benutzt wird ?
    Oder habe ich einen Fehler in dem Code? Ich probiere ansonsten die Try..catch so gut wie nie zu benutzen...

    Vielen Dank vorab für Eure Hilfe.
    Anstatt eine obskure MalformedLineException abzufagen (was mit File.Open sowieso nie geworfen wird), fängst du besser eine System.IO.IOException ab.

    Edit:
    Und am besten packst du noch ein Finally an den Try-Catch block, in dem du stream.Dispose() aufrufst, oder aber, was noch besser wäre, du packst deinen Stream in einen Using Block.
    Schau dir hier das zweite Beispiel dazu an:
    docs.microsoft.com/de-de/dotne…o.filestream?view=net-5.0
    (Sprache lässt sich oben von C# auf VB ändern)

    Mabbi schrieb:

    VB.NET-Quellcode

    1. Dim F As Short = CShort(FreeFile())
    Da kannst Du auch gleich ne MessageBox aufmachen und den User fragen, ob die Datei iwo geöffnet ist.
    Nutze z.B. FileInfo.Open():
    docs.microsoft.com/de-de/dotne…ileinfo.open?view=net-5.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!