dateiendungen auslesen und in datagridview sortieren

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von hjerteblod.

    dateiendungen auslesen und in datagridview sortieren

    Guten Morgen,

    es gibt einige Forenthreads zu dem Thema, die mir leider trotzdem nicht geholfen haben,
    weswegen ich es nochmal mit einem neuen Thread versuche.

    Ich habe einen Button, der den Folderdialog öffnet. Nach Auswahl eines Ordners werden alle
    Dateien aus diesem und seinen Unterordnern in eine Listbox geschrieben. Dabei filtere ich schon
    doppelte Einträge heraus und gebe mir nur die Dateiendungen aus. (z.B. 5 PDFs und 2 Word ergeben in der Liste einmal
    PDF und einmal Word). Funktioniert bestens. Nun soll das ganze aber in eine Datagridview und da stecke ich fest.
    Ich schaffe es, alle Dateien (bzw. ihre Extensions) auszugeben, aber nicht die doppelten zu filtern.

    VB.NET-Quellcode

    1. Public Sub ListboxFuellen()
    2. lblFortschritt.Visible = True
    3. Application.DoEvents()
    4. Try
    5. If FolderBrowserDialog1.ShowDialog = DialogResult.OK Then
    6. Dim files() As IO.FileInfo = New IO.DirectoryInfo(FolderBrowserDialog1.SelectedPath).GetFiles("*.*", SearchOption.AllDirectories)
    7. 'Container für den Dateityp
    8. Dim ext As String = ""
    9. 'Progressbar setzen
    10. ProgressBar1.Maximum = files.Count
    11. ProgressBar1.Value = 0
    12. lblFortschritt.Visible = False
    13. Application.DoEvents()
    14. For Each fi In files
    15. ext = IO.Path.GetExtension(fi.Name)
    16. 'Setzt den Fortshritt der ProgressBar1
    17. ProgressBar1.PerformStep()
    18. 'Verhindert das Einfrieren
    19. Application.DoEvents()
    20. 'IndexOf ermittelt, ob der Dateityp schon vorhanden ist
    21. If ListBox1.Items.IndexOf(ext) = -1 Then
    22. ListBox1.Items.Add(ext)
    23. End If
    24. '......diese If-Schleife funktioniert gut für die Listbox und die müsste ich umformen auf die Datagrid und hänge da fest
    25. Next
    26. lblDateienGesamt.Text = "Anzahl: " & ListBox1.Items.Count & " Dateitypen gefunden"
    27. End If
    28. Catch ex As Exception
    29. MsgBox(ex.Message)
    30. End Try
    31. End Sub


    Meine Idee war da mit sowas ranzugehen, was aber bisher nicht funzt.

    VB.NET-Quellcode

    1. For i As Integer = 0 To dgvDateien.Columns.Count - 1
    2. If Not dgvDateien.CurrentCell.Value.ToString = ext Then
    3. dgvDateien.Rows.Add(ext)
    4. end if
    Falls jemand das liest und es interessiert, ich habe es so gelöst:

    VB.NET-Quellcode

    1. If ListBox1.Items.IndexOf(ext) = -1 Then
    2. ListBox1.Items.Add(ext)
    3. Dim row As String() = New String() {ext, "1"}
    4. dgvDateien.Rows.Add(row)
    5. Else
    6. 'Hier die Zeile im Datagridview finden mit der Extension und den Zähler hochsetzen
    7. For Each row As DataGridViewRow In dgvDateien.Rows
    8. If row.Cells(0).Value.ToString = ext Then
    9. row.Cells(1).Value = CStr(CInt(row.Cells(1).Value.ToString) + 1)
    10. Exit For
    11. End If
    12. Next
    13. End If
    @hjerteblod Trenne Daten und GUI!
    Mach Dir ne List(Of String), die Du sukzessive mit den Extensionen befüllst, das geht dann auch prima in async, allerdings ohne Progressbar!
    Wenn die fertig befüllt ist, zeig die Daten an.
    Du wirst staunen, wieviel mal schneller das ist als Deine GUI-behaftete Lösung.
    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!
    @hjerteblod Machma die Extension mit .ToLower(), falls da im Verzeichnis eine .PNG neben einer .png liegt, was ja dieselbe Extension ist.
    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!
    @RodFromGermany eine Frage hätte ich noch, die du mir (oder jemand anderes) vielleicht schnell beantworten kannst,
    bevor ich nen neuen thread aufmache. bei meinen testordnern funktioniert das ganze, aber wenn ich es auf laufwerk c
    anwende kommt z.B. {"Der Zugriff auf den Pfad ""C:\$Recycle.Bin\S-1-5-18"" wurde verweigert."}
    Ich möchte gerne, dass die Schleife weiterläuft nach dieser verständlichen Unterbrechung, da da noch andere Files übrig sind.
    Nun könnte ich das mit continue do machen, muss dafür das ganze aber in eine do schleife packen und da hänge ich fest.

    gibts dafür ne leichte lösung die ich einfach gerade nicht sehe? wenn ich den ganzen try catch block wegmache, steigt er auch
    aus, also muss ich wohl irgendwie an der stelle catch ex ansetzen
    Das Problem wurde hier bereits mehrfach diskutiert. Einen wirklich schönen Ansatz gibt es nicht, da die Rechteverwaltung unter Windows ziemlich komplex ist und sich auch zwischen AD-Rechten und lokalen Rechten stark unterscheided.

    Eine vereinfachte Lösung habe ich hier schonmal gepostet.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    @hjerteblod Wenn Du durch Verzeichnisse iterierst, musst Du in einer äuißeren Schleife die Verzeichnise durchlaufen.
    Um die innere Schleife über die Dateien machst Du einb Try / Catch und fängst die Access-Denied-Exception ab (nur diese). Das geht in jedem Falle einfacher als die Rechte dieses Verzeichnisses abzufragen.
    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!
    ähm - wirklich vollständig kann man mit äusserer und innerer Schleife ein Directory nicht abarbeiten.
    Man muss es rekursiv angehen, oder mit einer Bread-first-traverse.
    vor allem empfehlen, mit Databinding zu arbeiten, und mit FileInfos - Keine Strings in die File-Listbox!
    Dort ist die Rekursion gezeigt, und ich glaub, da gibts auch ein Beispiel mit DGV-Binding.
    (Und wenn nicht, wärs egal, weils Databinding einer Listbox unterscheidet sich prinzipiell nicht vom Databinding eines DGVs)
    @ErfinderDesRades @RodFromGermany

    hab jetzt hier noch ne aktuelle lösung mit rekursivität, vielleicht nützt die was, wen's interessiert.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim oDir As IO.DirectoryInfo
    3. lbOrdner.Items.Clear()
    4. If FolderBrowserDialog1.ShowDialog Then
    5. oDir = New IO.DirectoryInfo(FolderBrowserDialog1.SelectedPath)
    6. ' alle Dateien des Ordners ermitteln
    7. ' und in der ListBox anzeigen
    8. Rekursiv(oDir)
    9. End If
    10. End Sub
    11. Private Sub Rekursiv(ByVal oDir As IO.DirectoryInfo)
    12. Dim oSubDir As IO.DirectoryInfo
    13. Dim oFile As IO.FileInfo
    14. Dim bZugriffverweigert As Boolean = False
    15. ' zunächst alle Dateien des Ordners aufspüren
    16. ' mit try catch Fehler bei Zugruff abfangen
    17. Try
    18. For Each oFile In oDir.GetFiles()
    19. With oFile
    20. lbOrdner.Items.Add(.FullName)
    21. End With
    22. Next
    23. Catch ex As Exception
    24. lbOrdner.Items.Add("gesperrt ==> " & vbCrLf & oDir.FullName)
    25. 'Hier Flag setzen, damit der gesperrte Ordner nicht nach Dateien durchsucht wird
    26. bZugriffverweigert = True
    27. End Try
    28. ' Jetzt alle Unterverzeichnis durchlaufen
    29. ' und die Prozedur rekursiv selbst aufrufen
    30. lblDateienGesamt.Text = lbOrdner.Items.Count
    31. Application.DoEvents()
    32. If Not bZugriffverweigert Then
    33. For Each oSubDir In oDir.GetDirectories()
    34. Try
    35. 'ListBox1.Items.Add(oSubDir.FullName)
    36. Rekursiv(oSubDir)
    37. Catch ex As Exception
    38. lbOrdner.Items.Add("gesperrt 2 ==> " & vbCrLf & oSubDir.FullName)
    39. End Try
    40. Next
    41. End If
    42. End Sub
    guck dir nochmal das von mir gegebene Tut an. Sowas:

    VB.NET-Quellcode

    1. Catch ex As Exception
    2. lbOrdner.Items.Add("gesperrt 2 ==> " & vbCrLf & oSubDir.FullName)
    3. End Try
    schiesst dir ins Knie, wenn da eine andere Exception auftritt, als du erwartest.
    Weil deine Fehlermeldung lügt dann, und dein Programm baut ziemlichen Bockmist, aber du hast keinen Hinweis (schlimmer noch: einen völlig falschen!), warum.
    Wie gesagt: Gugge nochmal das Tut, wie der TryCatch richtig geht. (Übrigens braucht man nur einen Trycatch.)

    Ups!! Ich hatte dir das falsche Tut verlinkt! Hier ist das gute (das noch gutere):
    Rekursive Dateisuche mit anonymer Methode

    Und gugge auch dieses Tut: TryCatch ist ein heißes Eisen

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

    @ErfinderDesRades Jou.
    Iwie haben die jungen Kollegen eine Leseschwäche, eine kollektive. ;)

    RodFromGermany schrieb:

    und fängst die Access-Denied-Exception ab (nur diese).
    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!

    ErfinderDesRades schrieb:

    so jung

    hjerteblod schrieb:

    so jung
    Jung im Geschäft. :D
    Und wenn Du das "Sch..." nennst, ist es möglich, dass uns das Helfen wollen keinen Spaß macht. ;(
    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!