List Files and Folders - Schneller machen?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Rikudo.

    List Files and Folders - Schneller machen?

    Hallo,
    Ich habe folgende Frage:
    Mit diesem Code liste ich mir alle Dateien und Verzeichnisse in einem bestimmten Verzeichnis.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Collections
    3. Imports System.Linq
    4. Public Class Form1
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. ListBox1.Items.Clear()
    7. Dim dirPath As String = TextBox1.Text
    8. For Each entry As String In Directory.GetDirectories(dirPath)
    9. DisplayFileSystemInfoAttributes(New DirectoryInfo(entry))
    10. Next
    11. For Each entry As String In Directory.GetFiles(dirPath)
    12. DisplayFileSystemInfoAttributes(New FileInfo(entry))
    13. Next
    14. End Sub
    15. Sub DisplayFileSystemInfoAttributes(ByVal fsi As IO.FileSystemInfo)
    16. ' Assume that this entry is a file.
    17. Dim entryType As String = "File"
    18. ' Determine if this entry is really a directory.
    19. If (fsi.Attributes And FileAttributes.Directory) = FileAttributes.Directory Then
    20. entryType = "Directory"
    21. End If
    22. ListBox1.Items.Add(fsi.FullName)
    23. ' Show this entry's type, name, and creation date.
    24. Console.WriteLine("{0} entry {1} was created on {2:D}", _
    25. entryType, fsi.FullName, fsi.CreationTime)
    26. End Sub
    27. End Class


    Allerdings, wenn ich den System32 Ordner aufliste dauert das sehr sehr lange. Gibt es eine möglichkeit das schneller effizienter zu machen?
    Ich möchte aber nicht nur die Dateien, sondern die Dateien und Ordner anzeigen.
    C# Developer
    Learning C++
    Dateioperationen werden durch die Festplatte in der Geschwindigkeit gebremst, und wenn du halt ein paar hundert Dateien ausließt merkt man das.
    Du könntest dir einen Enumerator holen, und dann immer nur die benötigten Dateien nachladen, was aber in deinem Fall denke ich nicht gewünscht ist, da du ja alle Dateien auf einmal haben willst.
    Also wenn das so aufgebaut ist:

    Mein Ordner hat Dateien und Subfolders.
    Nun, diesen Ordner will ich auslesen, aber:

    Nur die Dateien und die Ordner, nicht alle Subfolders ich will nicht die Komplette Struktur sondern nur die Dateien und Ordner in meinem Ordner.
    Die Unterordner der Ordner in meinem Ordner nicht!
    Ich hoffe du verstehst was ich meine ?(
    C# Developer
    Learning C++

    Rikudo schrieb:

    Ich hoffe du verstehst was ich meine
    So was:

    VB.NET-Quellcode

    1. Me.ListBox1.Items.AddRange(New IO.DirectoryInfo("c:\Temp").GetDirectories("*.*", IO.SearchOption.TopDirectoryOnly))
    2. Me.ListBox2.Items.AddRange(New IO.DirectoryInfo("c:\Temp").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly))
    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!
    Ja genau sowas ;D
    Aber wie packe ich die in ein ListView?

    Okay, das von RodFromgermany klappt ganz gut:

    Allerdings hab ich zwei fragen:
    1) Wie kann ich bevor ich die Ordner in die ListBox adde sagen, ich möchte sie so adden:

    VB.NET-Quellcode

    1. "###" + Ordnername + "###"
    ?
    Also ich rede von diesem Schnipsel:

    VB.NET-Quellcode

    1. ListBox1.Items.AddRange(New IO.DirectoryInfo(TextBox1.Text).GetDirectories("*.*", IO.SearchOption.TopDirectoryOnly))


    2) Wie kann ich die gelisteten Einträge in ein ListView adden? Da geht Items.add nicht? ;o


    Edit by Manschula: Unnötiges (Voll-) Zitat entfernt
    C# Developer
    Learning C++

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

    ListView ist dafür absolut ungeeignet. Ein DataGridView erfüllt diese Anforderungen, da es DataBinding unterstützt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Moin Rikudovb-paradise.de/user/15747-rikudo/,

    ListView ist dafür absolut ungeeignet. Ein DataGridView erfüllt diese Anforderungen, da es DataBinding unterstützt.

    da hat er meiner Meinung nach vollkommen recht der SpaceyX!

    Hier mal anbei eine Anregung, die zumindest für mich ordentliche Dienste leistet.
    Das Miniprojekt ist im Zuge einer 10 tägigen Projektarbeit in C# entstanden.
    Es ist ein einfacher Zweifenster-Dateimanager - sozusagen "Total-Commander-Light" :D .

    Die Basistechnologien:
    • Als Anzeige für Verzeichnisse und Dateien ein Usercontrol aus einem DataGridView
    • Das DataGridView wird aus einer DataTable versorgt und arbeitet im virtuellen Modus (nicht direkt gebunden!!)
    • Die DataTable wird mit zwei Backgroundworkern asynchron gefüllt (einmal alle Texte und separat die Icons)
    • Die System-Links (ReparsePoints) werden korrekt auf die physikalischen Verzeichnisse aufgelöst
    • Das holen der File/Folder Icons wird auch noch beschleunigt, in dem schon
      bekannte Icons aus einem Dictionary geholt werden, Unbekannte werden
      über die Win-API geholt und im Dict abgelegt
    Das Ganze arbeitet so schnell, dass das System32 Verzeichnis schneller angezeigt wird, als Du mit den Fingern schnipsen kannst :P ..

    Vielleicht ist es eine Anregung für Dich?


    LG,
    Bruno

    Das System32 wird mir jetzt auch (Dank RodFromGermany's Code) in weniger als einer Sekunde angezeigt.
    Und ja, ich weiß dass das DataGridView manchmal hierfür besser ist, aber ich will ein ListView verwenden.
    Und Ich bin immer noch am überlegen, wie ich strings zu den gelisteten Ordnern hinzufügen kann:

    Also mit diesem Code:


    VB.NET-Quellcode

    1. ListBox1.Items.AddRange(New IO.DirectoryInfo(TextBox1.Text).GetDirectories("*.*", IO.SearchOption.TopDirectoryOnly))


    Werden mir die Ordner ja lle problemlos gelistet. Aber wie adde ich für jeden ordner nen String? Also:

    Quellcode

    1. "BLASTRING" + Ordnername
    ?


    Edit by Manschula: Warum zitierst du deinen Vorschreiber vollständig?? --> Unnötiges (Voll-) Zitat entfernt
    C# Developer
    Learning C++

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