Daten einlesen - Status anzeigen

  • VB.NET

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

    Daten einlesen - Status anzeigen

    Hallo in die Runde,

    bislang war ich sehr oft hier im Forum als Zuschauer unterwegs und habe mir meine Codeschnipsel zusammengesucht.
    Ich bin kein Programmierer, versuche aber das Thema ala "Learning by Doing" zu bewältigen.
    Da man damit an Grenzen stößt, ist klar.

    Das Problem was ich jetzt habe, wird wahrscheinlich gar keins sein. Ich habe ein Programm, welches mittels "FolderBrowserDialog1" den Benutzer einen Pfad öffnen lässt um die darin enthaltenen Dateien einzulesen und nur als Gesamtzahl darzustellen. Soweit passt das auch und läuft.
    Da aber dieser Vorgang mitunter sehr lange läuft, würde ich dem Benutzer gern anzeigen, dass das Ding noch läuft und nicht abgeschmiert ist.
    Bei meiner Suche habe ich viel von Progressbar und BAckgroundworker etc gelesen.
    Mir würde es absolut reichen, wenn das Einlesen der Dateien nummerisch in einem Label dargestellt wird. Ergo, wie wenn eine Stoppuhr hochzählt, bis es eben fertig ist.
    Ist so etwas realisierbar?

    Ich hoffe, Ihr habt ein Einsehen mit mir und könnt mir den richtigen Weg weisen.
    Mich voll und ganz dem Thema "Programmierung" hinzugeben fehlt mir leider die Zeit.

    Ich bin über jedes Schnipsel dankbar!

    Beste Grüße
    Willkommen im Forum. :thumbup:

    Madde schrieb:

    Ist so etwas realisierbar?
    So was:

    VB.NET-Quellcode

    1. Dim fi() = New DirectoryInfo(DEIN_VERZEICHNIS).GetFiles("*.*")
    2. For i = 0 To fi.Length - 1
    3. Label1.Text = String.Format("Fatei {o} von {1}", i + 1 , fi.Length)
    4. ' mit fi.FullName was tun
    5. Next

    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!
    Hey, erstmal Danke für Deine Antwort.

    leider bekomme ich Deinen Code nicht so eingebaut, wie ich möchte.
    War das kleine o statt der 0 ein Test? ;) Sowas ist für mich als Laie schon eine Herausforderung. :D
    Unten mal meine Zeilen wo es rein soll, durchaus möglich, dass das völlig krumm daherkommt, bin eben wie erwähnt ein absoluter Anfänger.

    Ich dank Dir schonmal

    VB.NET-Quellcode

    1. Dim suche As String
    2. FolderBrowserDialog1.ShowDialog()
    3. suche = FolderBrowserDialog1.SelectedPath
    4. Dim directory As New IO.DirectoryInfo(suche)
    5. Dim files As Integer = My.Computer.FileSystem.GetFiles _
    6. (suche, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    7. 'Auflistung der Ordner und Dateien
    8. Ordner.Text = (directory.GetDirectories("*", IO.SearchOption.AllDirectories).Length)
    9. Dateien.Text = (files)

    Madde schrieb:

    War das kleine o
    Da muss eine 0 (Null) hin.
    Kleiner Streich vom großen Gravitator. ;)

    Madde schrieb:

    Unten mal meine Zeilen wo es rein soll
    Keine Ahnung, denn Du arbeitest lediglich mit einer Anzahl von Dateien und Verzeichnissen, nicht mit den Dateien selbst.
    Beschreib mal, was da passieren soll.
    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!
    Guten Morgen,

    RodFromGermany schrieb:

    Beschreib mal, was da passieren soll.


    Also, das Ziel ist, den Benutzer einen Pfad auswählen zu lassen. Das Ergebnis dieser Auswahl ist die Auflistung der ANZAHL von Ordner/Unterordner und Dateien. Hintergrund ist, ich muss wissen, wieviel der genannten vorhanden sind.
    Die Ordner und die Dateien habe ich jeweils auf einem Label platziert.

    VB.NET-Quellcode

    1. 'Auflistung der Ordner und Dateien
    2. Ordner.Text = (directory.GetDirectories("*", IO.SearchOption.AllDirectories).Length)
    3. Dateien.Text = (files)

    Dies funktioniert auch gut. Mir wird angezeigt, wieviel Ordner und Dateien in dem gewählten Pfad existieren. Bei diesen Daten handelt es sich um eingescannte Unterlagen, welche ich benennen will. Da es Ordner gibt, die richtig voll sind, hätte ich hier gern eine Anzeige, dass das Programm noch läuft. Hier kam mir der Gedanke, jeder Wert wird "sichtbar" als Zahl hochgezählt. Da das Auge nicht jede Veränderung wahrnimmt, reicht es auch, wenn nur die Dateien optisch dargestellt werden.
    Das tatsächliche Endergebnis ist mir ja bereits bekannt. Mir geht es nur um die Wartezeit.
    Alternativ wäre auch ein Label, welches "Bitte warten - Prozess läuft" anzeigt (eventuell aller paar Sekunden blinkend oder so), möglich.

    Ich hoffe, ich konnte das verständlich rüberbringen.

    Grüße
    @Madde Da das Einlesen der Ordner / Dateien jeweils in einem einzigen Befehl erfolgt, geht hier keine kontinuierliche Anzeige.
    Wenn Du das brauchst, musst Du die Dateien einzeln und verzeichnisweise rekursiv aufsammeln und dann entsprechend die GUI updaten.
    Glaub mir, das dauert mindestens 4 (vier) Mal so lange :!:
    Du kannst aber das aufsammeln asynchron machen (Task / Await), da wird die GUI nicht blockiert.
    Wenn Du ein Label mit einem Hinweis anzeigen willst, mach das unmittelbar vor dem Aufruf, und Du musst sicherstellen, dass das Label auch aktualisiert wird:

    VB.NET-Quellcode

    1. Label1.Text = "Bitte warten ..."
    2. Label1.Update()
    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!
    Danke RodFromGermany für Deine Hilfe, ich hab jetzt mit if else das Label mit zwei "Anzeigen" belegt.
    Das reicht mir für die Zwecke. Noch ein kleines gif daneben, was eine Aktivität suggeriert.

    VB.NET-Quellcode

    1. If Dateien.Text = "" Then
    2. warten.Text = "Bitte warten ..."
    3. PictureBox1.Show()
    4. End If
    5. Dim suche As String
    6. FolderBrowserDialog1.ShowDialog()
    7. suche = FolderBrowserDialog1.SelectedPath
    8. Dim directory As New IO.DirectoryInfo(suche)
    9. Dim files As Integer = My.Computer.FileSystem.GetFiles _
    10. (suche, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
    11. If Dateien.Text <= "0" Then
    12. warten.Text = "Erfolgreich eingelesen!"
    13. PictureBox1.Hide()
    14. End If


    Hat sicherlich nicht sooo viel mit Prammierung zu tun aber für meine Zwecke wird das reichen.

    Vlt bleib ich ja am Ball ;)

    Grüße

    Madde schrieb:

    VB.NET-Quellcode

    1. If Dateien.Text <= "0" Then
    Was ganz genau wird denn da getestet?
    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!

    Madde schrieb:

    oder bereits eine Zahl drinsteht
    Da steht keine Zahl drin, da steht ein String drin.
    Wenn Du eine Zahl testen willst, solltest Du mit Zahlen arbeiten, nicht mit Strings.
    Trenne Daten und GUI :!:
    Mit Zahlen wird gearbeitet, als Ergebnis werden die String-Repräsentationen von Zahlen an der GUI formatiert dargestellt!
    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!