Alle Dateien in Directory mit Sub-Directories?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ChOoSeMyNaMe.

    Alle Dateien in Directory mit Sub-Directories?

    Hallo!
    Ich möchte, das mein Programm alle Dateien in einem bestimmten Directory anzeigt.
    Das ganze funktioniert schonmal. Nun habe ich aber eine Checkbox, mit der man einstellen kann, ob Sub-Directories berücksichtigt werden sollen.
    Ich habe schon gegooglet, aber habe leider nichts gefunden, oder nur eine Teil-Lösung, die nicht wirklich verständlich war.

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub Worker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Worker.DoWork
    2. Dim FileLocation As DirectoryInfo = New DirectoryInfo(path)
    3. Dim fi As List(Of FileInfo) = New List(Of FileInfo)
    4. For Each File In FileLocation.GetFiles()
    5. If (File IsNot Nothing) Then
    6. If (IO.Path.GetExtension(File.ToString.ToLower) = ext) Then
    7. Invoke(Sub() lb.Items.Add(File.FullName))
    8. End If
    9. End If
    10. Next
    11. Dim files() As String = Invoke(Sub() lb.Items.ToString())
    12. For i As Integer = 0 To lb.Items.Count - 1
    13. If File.Exists(ex2 & "\" & IO.Path.GetFileName(lb.Items(i))) = False Then
    14. File.Copy(lb.Items(i), ex2 & "\" & IO.Path.GetFileName(lb.Items(i)))
    15. End If
    16. Next
    17. End Sub
    18. 'Notiz: Variablen, die nicht deklariert sind, sind globale Variablen.

    Würde mich über jegliche Hilfe freuen!
    MfG,
    C8002.
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    Dein Code sieht sehr nach C&P aus. Naja.
    Zur Theorie:
    Nutze die GetFiles()-Funktion der Directory-Klasse, diese ist statisch.
    Die gibt dir ein String-Array zurück. Dann nimmst du eine List(Of FileInfo) und gehst dann das Array durch und erstellst aus jedem Item eine neue FileInfo und fügst die der Liste zu. Zugut daletzt bindest du die Liste an die Listbox, der EDR hat dazu mal ein Tutorial dazu hier im Forum gepostet.
    Außerdem stelle bitte unbedingt Option Strict On! Du kannst nicht einfach Objects in Strings oder gar ein String-Array umwandeln!
    Das erspart dir einiges.

    LG
    @Ch0oSeMyNaMe
    Ok, werd mal mit Option Strict On und deiner Erklärung darüber gehen.
    Übrigens, das ist kein C&P,sondern ein von mir geschriebener Code.
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    Hm, Ich hab mal den Code editiert ,so das eine Linie ungefähr so ausieht:

    VB.NET-Quellcode

    1. For Each File In FileLocation.GetFiles(SearchOption.AllDirectories)

    Aber diesmal wird mir noch nicht 'mal etwas in der Listbox angezeigt, und die gewohnte "Fertig!"-MsgBox, die ich gesetzt habe, taucht auf...
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    Ok um dir zu zeigen was ich meine:
    Beispiel Nummer 1, per DirectoryInfo:

    VB.NET-Quellcode

    1. Private fileinfos() As FileInfo
    2. Private Sub Worker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Worker.DoWork
    3. If String.IsNullOrEmpty(ext) Then ext = "*"
    4. Dim FileLocation As DirectoryInfo = New DirectoryInfo(path)
    5. Dim searchoption As IO.SearchOption = IO.SearchOption.TopDirectoryOnly
    6. If searchall Then searchoption = IO.SearchOption.AllDirectories
    7. fileinfos = FileLocation.GetFiles("*." & ext, searchoption)
    8. lb.DataSource = fileinfos
    9. For Each item As FileInfo In fileinfos
    10. If Not File.Exists(ex2 & "\" & item.FullName) Then
    11. File.Copy(item.Name, ex2 & "\" & item.FullName))
    12. End If
    13. Next
    14. End Sub


    Beispiel Nr.2 per Directory-Klasse:

    VB.NET-Quellcode

    1. Private fileinfos() As FileInfo
    2. Private Sub Worker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Worker.DoWork
    3. If String.IsNullOrEmpty(ext) Then ext = "*"
    4. Dim _files As New List(Of FileInfo)
    5. Dim searchoption As IO.SearchOption = IO.SearchOption.TopDirectoryOnly
    6. If searchall Then searchoption = IO.SearchOption.AllDirectories
    7. For Each item As String In Directory.GetFiles(path, "*." & ext, searchoption)
    8. _files.Add(New FileInfo(item))
    9. Next
    10. fileinfos = _files.ToArray()
    11. lb.DataSource = fileinfos
    12. For Each item As FileInfo In fileinfos
    13. If Not File.Exists(ex2 & "\" & item.FullName) Then
    14. File.Copy(item.Name, ex2 & "\" & item.FullName))
    15. End If
    16. Next
    17. End Sub


    Bei beiden Beispielen nutze ich zusätzlich noch die ext-Variable, die ich in deinem Code gesehen habe, ich schätze mal das du damit nach Extension filtern wolltest. Deshalb wird zuerst geprüft ob die Variable leer ist, wenn ja wird ihr "*" zugewiesen. Sternchen heißen bei dem SearchPattern immer, dass die Anzahl oder Werte der Zeichen egal sind.
    Das FileInfo-Array wird der Listbox als Datasource zugewiesen, dass heißt du musst nicht extra auf die Items der Listbox zugreifen, denn die dient nur als Visualisierung, die eigentlichen Daten sind in dem Array. Somit hast du dank FileInfo alle Infos über die Dateien die du brauchst.
    Übrigens wenn du Dateien so holst, dann musst du nicht extra prüfen ob die Dateien existieren, denn wenn sie nicht existieren würden, dann können sie auch nicht im Ordner sein.

    Noch zum durchlesen und besserem Verständnis:
    FileInfo
    DirectoryInfo
    DirectoryInfo.GetFiles()
    DirectoryInfo.GetFiles()-Überladungen
    Directory
    Keine Strings in die File-Listbox!

    LG

    PS:
    Die Copy-Funktion musst du noch entsprechend anpassen, die wird so nicht funktionieren. :D