Abfangen von Exceptions beim Laden von FileInfo

  • VB.NET

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

    Abfangen von Exceptions beim Laden von FileInfo

    Hi,

    ich befülle über DataBinding eine ListBox "lstFiles". Das klappt normalerweise auch hervorragend.

    VB.NET-Quellcode

    1. Private Sub AccessFiles(ByRef strSourceDirectory As String)
    2. Dim allfiles = New DirectoryInfo(strSourceDirectory).GetFiles
    3. Dim files = New List(Of FileInfo)
    4. For Each found In allfiles
    5. If UCase(found.Extension) = ".JPG" Then files.Add(found)
    6. Next
    7. FileInfoBindingSource.DataSource = files
    8. lstFiles.Select()
    9. End Sub


    Jetzt würde ich gern Fehler wie "Unauthorized Access abfangen. Ich habe folgendes Coding versucht:

    VB.NET-Quellcode

    1. Private Sub AccessFiles(ByRef strSourceDirectory As String)
    2. 'Display pictures
    3. Dim allfiles As DirectoryInfo
    4. Try
    5. allfiles = DirectoryInfo(strSourceDirectory).GetFiles
    6. Catch ex As Exception
    7. MsgBox(ex.Message)
    8. Exit Sub
    9. End Try
    10. Dim files = New List(Of FileInfo)
    11. For Each found In allfiles
    12. If UCase(found.Extension) = ".JPG" Then files.Add(found)
    13. Next
    14. FileInfoBindingSource.DataSource = files
    15. lstFiles.Select()
    16. End Sub


    Das klappt aber nicht.

    Fehler 1 "DirectoryInfo" ist ein Typ und kann nicht als Ausdruck verwendet werden.

    Die Korrektur mit IntelliSense (Methodenstub generieren) liefert die Fehlermeldung

    Fehler 1 "Option Strict On" lässt spätes Binden nicht zu.

    Und damit bin ich mit meinem Latein am Ende!

    Was mache ich denn falsch?

    LG
    Peter

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

    Bei Zeile 4 hatte ich auch schon Folgendes probiert:

    VB.NET-Quellcode

    1. Dim allfiles As New DirectoryInfo


    Mit der Fehlermeldung:

    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "New" diese Anzahl von Argumenten akzeptiert.

    Das sagt mir aber leider auch nix!

    LG
    Peter
    ok ... also in "allfiles" will ich DirectoryInfo Zeilen ablegen.

    Die Meldung, mit der Überladungsauflösung heißt doch wohl, dass Parameter fehlen.

    VB.NET-Quellcode

    1. Private Sub AccessFiles(ByRef strSourceDirectory As String)
    2. 'Display pictures
    3. Dim allfiles As New DirectoryInfo(strBaseDirectory)
    4. Try
    5. allfiles = DirectoryInfo(strSourceDirectory).GetFiles
    6. Catch ex As Exception
    7. MsgBox(ex.Message)
    8. Exit Sub
    9. End Try
    10. Dim files = New List(Of FileInfo)
    11. For Each found In allfiles
    12. If UCase(found.Extension) = ".JPG" Then files.Add(found)
    13. Next
    14. FileInfoBindingSource.DataSource = files
    15. lstFiles.Select()
    16. End Sub


    Jetzt ist diese Meldung wech. Aber ich kriege immer noch in Zeile 6 die Meldung:

    Fehler 1 "DirectoryInfo" ist ein Typ und kann nicht als Ausdruck verwendet werden.

    hmm ... die Angabe von strSourceDirectory ist ja jetzt auch irgendwie "doppelt gemoppelt" ....
    Die GetFiles Methode gibt mir eine Liste von Files zurück. Da habe ich ja auch so versucht:

    VB.NET-Quellcode

    1. Private Sub AccessFiles(ByRef strSourceDirectory As String)
    2. 'Display pictures
    3. Dim DirInfo As DirectoryInfo
    4. Try
    5. DirInfo = DirectoryInfo(strBaseDirectory)
    6. Catch ex As Exception
    7. MsgBox(ex.Message)
    8. Exit Sub
    9. End Try
    10. Dim allfiles() As FileInfo = DirInfo.GetFiles
    11. Dim files = New List(Of FileInfo)
    12. For Each found In allfiles
    13. If UCase(found.Extension) = ".JPG" Then files.Add(found)
    14. Next
    15. FileInfoBindingSource.DataSource = files
    16. lstFiles.Select()
    17. End Sub


    Aber ich kriege nach wie vor in Zeile 6 die Fehlermeldung:

    Fehler 1 "DirectoryInfo" ist ein Typ und kann nicht als Ausdruck verwendet werden.

    Also die Instanzierung von DirInfo kriege ich irgendwie nicht gebacken! Da bin ich jetzt wieder genauso weit wie zu Beginn der Diskussion!

    LG
    Peter
    Also, das Beispiel habe ich mir sehr genau angeschaut.

    Nach langen Versuchen funktioniert nun das folgende Coding:

    VB.NET-Quellcode

    1. Private Sub AccessFiles(ByRef strSourceDirectory As String)
    2. Dim DirInfo As DirectoryInfo = New DirectoryInfo(strSourceDirectory)
    3. Dim allfiles() As FileInfo
    4. Try
    5. allfiles = DirInfo.GetFiles
    6. Catch ex As Exception
    7. MsgBox(ex.Message)
    8. Exit Sub
    9. End Try
    10. Dim files = New List(Of FileInfo)
    11. For Each found In allfiles
    12. If UCase(found.Extension) = ".JPG" Then files.Add(found)
    13. Next
    14. FileInfoBindingSource.DataSource = files
    15. lstFiles.Select()
    16. End Sub


    Allerdings muss ich offen gestehen, dass ich die Sache NICHT verstehe:

    Wieso ist denn für "alldirs" keine Instanzierung mit NEW erforderlich????

    Warum muss ich "Dim alldirs() ..." schreiben und nicht "Dim alldirs ... " ????

    VB1963 schrieb:

    ...weil dir die DirInfo.GetFiles-Methode ein Array als FileInfos zurrückgibt


    Das ist mir schon klar, dass ich da einen Array erhalte. Aber ich kann doch auch einen Array mit "New" instanzieren. Die Anweisung

    VB.NET-Quellcode

    1. Dim allfiles = New DirectoryInfo(strSourceDirectory).GetFiles


    hat ja schließlich auch funktioniert.

    Also mir ist das ziemlich schleierhaft, wann die Klausel "New" zur Instanzierung benötigt wird und wann man an den Variablennamen leere Klammern anfügen muss, also "Dim allfiles()" statt "Dim allfiles" ...

    @xtts02: Dein Zitat verstehe ich nicht. Diese Anweisung war doch vollkommen unkritisch. Na, vielleicht ist da einfach der Cursor verrutscht.

    Ansonsten gibt es ja nur eine Variante für den Aufruf von GetFiles:

    'Declaration
    Public Function GetFiles As FileInfo()

    Rückgabewert
    Typ: System.IO.FileInfo()
    Ein Array vom Typ FileInfo.

    LG
    Peter

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

    Hat

    Peter329 schrieb:

    GetFiles
    nicht iwelche Parameter, so dass Du aus dem ganzen Code einen Einzeiler machen kannst?
    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!

    VB1963 schrieb:

    ErfinderDesRades hat das hier gut erklärt.


    Das hab ich mir jetzt durchgelesen! Es bestätigt mein Gefühl, dass die Syntax in VB hinsichtlich der Instanzierung alles andere als durchgängig ist, ohne dass ich jetzt deshalb für mein spezielles Problem eine Erklärung hätte.

    RodFromGermany schrieb:

    Hat

    Zitat von »Peter329«
    GetFiles

    nicht iwelche Parameter, so dass Du aus dem ganzen Code einen Einzeiler machen kannst?


    Oh Mann ... du machst es diesmal aber spannend! Keine Ahnung wie das mit einer Zeile zu machen sein soll. Ich bin froh, dass ich das ÜBERHAUPT hinbekommen habe!

    xtts02 schrieb:

    Und unnötig.


    Das ist die Anweisung, um die es hier geht:

    VB.NET-Quellcode

    1. If UCase(found.Extension) = ".JPG" Then files.Add(found)


    Mit dieser Anweisung zeige ich nur solche Dateien an, die die Extension ".jpg" (in Klein- oder Großbuchstaben) haben. Alle anderen Dateien werden vom Display ausgeschlossen. Weil es sich um einen PictureViewer handelt. Warum also soll denn diese Anweisung unnötig sein?

    Vielen Dank für eure Hilfe ... vielleicht waren meine Fragen diesmal nicht ganz so einfach zu beantworten.

    LG
    Peter

    Peter329 schrieb:

    Keine Ahnung wie das mit einer Zeile zu machen sein soll.
    So etwa:

    VB.NET-Quellcode

    1. Dim files() = New IO.DirectoryInfo("c:\Temp").GetFiles("*.jpg", IO.SearchOption.AllDirectories)
    2. ListBox1.DataSource = files
    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!
    Ok, jetzt verstehe ich endlich, worauf ihr hinaus wollt:

    VB.NET-Quellcode

    1. Try
    2. allfiles = DirInfo.GetFiles("*.jpg")
    3. Catch ex As Exception
    4. MsgBox(ex.Message)
    5. Exit Sub
    6. End Try


    Mein Programm ist aber im Entwicklungsstadium. In der finalen Version müssen dann auch Dateien vom Typ *.gif und *.bmp ... etc. aufgelistet werden.

    Ich hab mal einfach die Sache wie folgt versucht:

    VB.NET-Quellcode

    1. Try
    2. allfiles = DirInfo.GetFiles("*.jpg")
    3. allfiles = DirInfo.GetFiles("*.gif")
    4. Catch ex As Exception
    5. MsgBox(ex.Message)
    6. Exit Sub
    7. End Try


    Das klappt aber nicht, da werden nur die .gif Dateien angezeigt.

    Kann man das trotzdem noch irgendwie mit dieser Technik lösen. Oder muss ich doch mit der Schleife arbeiten?

    LG
    Peter