Alle Verzeichnisse und Unterverzeichnisse prüfen außer...

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Alle Verzeichnisse und Unterverzeichnisse prüfen außer...

    Hallo zusammen,

    ich hätte eine Frage und wäre erfreut, wenn ihr mir helfen könntet:

    Ich schreibe ein VB-Programm, welches alle Unterverzeichnisse nach mp4-Dateien durchsuchen soll. Leider kommt eine System.UnauthorizedAccessException , da das Programm versucht, auf "C:\Users\HP\Documents\Eigene Bilder" zuzugreifen, was von Windows verwehrt wird. Dann ist das so, aber wie kann ich diesen Ordner überspringen, ohne ganz aufzuhören? Ich habe es bereits mit try catch versucht. Das Problem ist, dass das Programm dann ganz aufhört...

    Dim Pfad3 = "‪C:\Users\HP\Documents"
    Dim foundFiles

    Try

    foundFiles = My.Computer.FileSystem.GetFiles(Pfad3, FileIO.SearchOption.SearchAllSubDirectories, "*.mp4")

    Catch ex As UnauthorizedAccessException 'weil er nicht in alle Ordner darf -> soll er dann überspringen
    End Try
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

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

    @Bartosz Willkommen im Forum. :thumbup:
    Geh die Verzeichnisse einzeln iterativ durch und fang genau diese Exception mit Try-Catch ab.
    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!
    Dankeschön! Ich hab's jetzt so gemacht. Hier gezeigt für den Pictures-Ordner, danach dasselbe für Downloads und für Documents

    Dim accounts3 As New List(Of String)
    Dim accounts_vorhanden3() As String = Directory.GetDirectories("C:\Users\HP\Pictures")
    Dim wieviele = accounts_vorhanden3.Length

    For i As Integer = 0 To (wieviele - 1)
    For Each F As String In Directory.GetFiles(accounts_vorhanden3(i))
    If F.EndsWith(".mp4") Or F.EndsWith(".AVI") Or F.EndsWith(".avi") Or F.EndsWith(".mov") Or F.EndsWith(".mpg") Or F.EndsWith(".flv") Or F.EndsWith(".wmv") Or F.EndsWith(".mpeg") Or F.EndsWith(".mpe") Or F.EndsWith(".mpv") Or F.EndsWith(".m1v") Or F.EndsWith(".m4v") Or F.EndsWith(".ifv") Or F.EndsWith(".qt") Then
    accounts3.Add(F)
    ListBox1.Items.Add(F)
    Index += 1
    TextBox1.Text = Index.ToString
    TextBox1.Refresh()
    End If
    Next
    Next

    Application.DoEvents()

    '-------------------------------------------------------------------------------------------------
    Nun bekomme ich keine Probleme. Wahrscheinlich, weil Directory.GetDirectories nur die erlaubten Pfade wiedergibt?
    Ich habe außerdem programmiert, dass er sich nicht nur die Unterverzeichnisse holt, sondern auch den eigentlichen Ordner durchsucht ;)
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz bei GetFiles() gibt es eine Überladung, wo Du die Extension angeben kannst.
    Statt Or machst Du OrElse das geht schneller.
    ====
    Arbeite mit DirectoryInfo und FileInfo
    Pack alle Extensionen.ToLower() in eine List(Of String). Hol Dir die Extension ais der FileInfo-Instanz und frag die Liste ab, ob die Extension vorkommt:

    VB.NET-Quellcode

    1. If MyList.Contains(DIE_EXTENSION.ToLower()) Then
    2. ' kommt vor
    3. End If
    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, ich habe jetzt überall OrElse stehen.
    Aber das mit der Liste müsstest du mir kurz erklären bitte :)
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Verwende statt GetFiles lieber EnumerateFiles. Dann wird ein Exception erst fliegen, wenn ein verbotenes Verzeichnis oder eine entsprechende Datei ganz konkret aufgerufen wird und nicht schon im For-Schleifenkopf bei GetFiles. Als Ansatz

    VB.NET-Quellcode

    1. Private Sub ScanDiretory(RootDirectory As IO.DirectoryInfo)
    2. For Each Directory In RootDirectory.EnumerateDirectories
    3. Try
    4. For Each File In Directory.EnumerateFiles
    5. Try
    6. 'Hier die Aktion, die gemacht werden soll, wenn eine Datei gefunden wird
    7. ScanDiretory(Directory)
    8. Catch Ex As UnauthorizedAccessException
    9. End Try
    10. Next
    11. Catch Ex As UnauthorizedAccessException
    12. End Try
    13. Next
    14. End Sub

    Ungeprüft aus dem Kopf heraus.

    btw: bitte CodeTags verwenden

    ##########

    Aufgrund der Antwort von @RodFromGermany Code korrigiert. Das kommt davon, von wegen aus-dem-Kopf-heraus :S
    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.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    @Bartosz So was:

    VB.NET-Quellcode

    1. Dim accounts3 As New List(Of String)
    2. Dim accounts_vorhanden3() = New DirectoryInfo("C:\Users\HP\Pictures").GetDirectories()
    3. Dim MyList = New List(Of String) From {".mp4", ".avi", ".mov", ".mpg", ".flv", ".wmv", ".mpeg", ".mpe", ".mpv", ".m1v", ".m4v", ".ifv", ".qt"}
    4. For Each di In accounts_vorhanden3
    5. For Each fi In di.GetFiles("*.*", SearchOption.TopDirectoryOnly)
    6. If MyList.Contains(fi.Extension.ToLower()) Then
    7. accounts3.Add(fi.FullName)
    8. End If
    9. Next
    10. Next

    @VaporiZed Try- und Catch-Block-Inhalt tauschen.
    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!
    @VaporiZed Das funtkioniert super, danke! Und die Liste von @RodFromGermany baue ich jetzt auch ein.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Alle wichtigen Items mit Pfad davor sind in der Listbox. Wenn der Benutzer ein Item auswählt und die Enter-Taste drückt, soll der VLC-Player mit der Datei aufgerufen werden. Das klappt nicht, wenn der Pfad ein Leerzeichen enthält.
    Der Player öffnet zwar, aber er gibt eine Fehlermeldung aus. Man sieht in seiner Inhaltsliste, dass er
    4 verschiedene "Titel" laden wollte...
    Könntet ihr mir bitte sagen, wie ich das umgehe?

    Als zweite Sache erscheint die Warnung BC 42025: Zugriff des freigegebenen Members, konstanten Members,...der qualifizierende Ausdruck wird nicht ausgewertet.

    VB.NET-Quellcode

    1. vbKey1.Enter
    ist unterstrichen. Im Programm läuft's aber.

    VB.NET-Quellcode

    1. Private Sub ListBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBox1.KeyDown
    2. Dim _boolDblClick(Index - 1) As Boolean
    3. For j As Integer = 0 To (Index - 1)
    4. _boolDblClick(j) = ListBox1.GetSelected(j)
    5. If e.KeyCode = vbKey1.Enter And (_boolDblClick(j) = True) Then
    6. Try
    7. Process.Start("C:\Program Files\VideoLAN\VLC\vlc.exe", ListBox1.SelectedItem.ToString)
    8. Catch ex As System.ComponentModel.Win32Exception
    9. MsgBox("keinen VLC-Player gefunden")
    10. End Try
    11. End If
    12. Next
    13. End Sub
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

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

    Lediglich Process.Start(ListBox1.SelectedItem.ToString) funktioniert auch nicht?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo Doch das war der Fehler. Ich wollte eigentlich explizit sagen, dass der VLC geöffnet werden soll, aber wenn er standardmäßig geöffnet wird (weil man das mal so eingestellt hatte), dann ist das auch OK.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Du musst noch zusätzliche Anführungszeichen reinhauen: Process.Start("C:\Program Files\VideoLAN\VLC\vlc.exe", """" & ListBox1.SelectedItem.ToString & """"), sonst sind das offiziell mehrere Argumente für die Befehlszeile.
    Was genau ist vbKey1?

    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort MsgBox
    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.
    @VaporiZed Das ist auch gut, danke.

    VB.NET-Quellcode

    1. Private vbKey1 As Keys

    Ich las gerade raus, dass man MsgBox nicht mehr verwendet, sondern MessageBox.Show.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

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

    vbKey1 ist also eine Instanz vom Typ Keys. Da an der von Dir genannten Stelle Enter ein freigegebener Member der Keys-Enumeration der System.Windows.Forms-Klasse ist, man also keine Objektinstanz braucht, um darauf zuzugreifen, kommt die Warnung. Du kannst also mit Instanz arbeiten (vbKey1.Enter), es reicht aber auch Keys.Enter.
    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.